2015-09-15 24 views
7

Tôi muốn gửi công việc từ một chủ đề đến một vòng lặp sự kiện asyncio (giống như run_in_executor nhưng ngược lại).Gửi công việc đến vòng lặp sự kiện asyncio

Đây là những gì các tài liệu asyncio nói về concurrency and multithreading:

Để lên lịch gọi lại từ một chủ đề khác nhau, phương pháp này BaseEventLoop.call_soon_threadsafe() nên được sử dụng. Ví dụ để sắp xếp một coroutine từ một thread khác nhau: loop.call_soon_threadsafe(asyncio.async, coro_func())

đó làm việc tốt nhưng kết quả của coroutine bị mất. Thay vào đó, bạn có thể sử dụng chức năng thêm một cuộc gọi lại được thực hiện cho tương lai được trả về bởi async (hoặc ensure_future) để chủ đề có thể truy cập kết quả thông qua một concurrent.futures.Future.

Có lý do cụ thể nào khiến tính năng này không được triển khai trong thư viện chuẩn không? Hay tôi đã bỏ lỡ một cách đơn giản hơn để đạt được điều đó?

Trả lời

6

Yêu cầu của tôi được thực hiện theo cách của nó và chức năng run_coroutine_threadsafe đã được triển khai here.

Ví dụ:

def target(loop, timeout=None): 
    future = asyncio.run_coroutine_threadsafe(add(1, b=2), loop) 
    return future.result(timeout) 

async def add(a, b): 
    await asyncio.sleep(1) 
    return a + b 

loop = asyncio.get_event_loop() 
future = loop.run_in_executor(None, target, loop) 
assert loop.run_until_complete(future) == 3 

tôi lên đâu một sub-class của concurrent.futures.Executor mà vẫn có thể được thực hiện như:

class LoopExecutor(concurrent.futures.Executor): 
    """An Executor subclass that uses an event loop 
    to execute calls asynchronously.""" 

    def __init__(self, loop=None): 
     """Initialize the executor with a given loop.""" 
     self.loop = loop or asyncio.get_event_loop() 

    def submit(self, fn, *args, **kwargs): 
     """Schedule the callable, fn, to be executed as fn(*args **kwargs). 
     Return a Future object representing the execution of the callable.""" 
     coro = asyncio.coroutine(fn)(*args, **kwargs) 
     return asyncio.run_coroutine_threadsafe(coro, self.loop) 
+0

làm bạn muốn đặt này trong câu hỏi nên nó doesnt có vẻ như là một câu trả lời –

+0

Vâng, đó là một loại câu trả lời cho câu hỏi của riêng tôi (http://stackoverflow.com/help/self-answer), vì có thể có cách tốt hơn để đạt được điều tương tự. – Vincent

+0

nếu bạn nhìn thấy nó theo cách đó, ok :) –

Các vấn đề liên quan