2015-09-15 20 views
7

Bir iş parçacığından asyncio olay döngüsüne (örneğin run_in_executor gibi, ancak diğer yollarla) iş göndermek istiyorum.Bir asyncio olay döngüsüne iş gönderme

İşte asyncio belgelerine yaklaşık concurrency and multithreading böyle diyor:

farklı bir iş parçacığı bir geri planlamak için BaseEventLoop.call_soon_threadsafe() yöntemi kullanılmalıdır. Örnek farklı bir iş parçacığı bir eşyordam planlamak için: loop.call_soon_threadsafe(asyncio.async, coro_func())

çalışıyor ama eşyordamın sonucu kaybolur O.

Bunun yerine, iş parçacığı bir concurrent.futures.Future yoluyla sonucunu erişebileceği şekilde async (veya ensure_future) tarafından döndürülen geleceğe yapılan geri arama ekleyen bir işlevi kullanmak mümkündür.

Böyle bir özelliğin standart kitaplıkta uygulanmasının belirli bir nedeni var mı? Ya da bunu başarmanın daha basit bir yolunu mu özledim?

cevap

6

İsteğim gerçekleşti ve run_coroutine_threadsafe işlevi uygulandı here.

Örnek:

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 

Başlangıçta hala olarak uygulanabilir concurrent.futures.Executor bir alt sınıfını yayınladı:

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

bunu doesnt böylece söz konusu bu koymak istiyorsun bir cevap gibi görünüyor –

+0

Peki, aynı şeyi elde etmek için daha iyi bir yol olabileceğinden, [kendi sorumu için kısmi bir cevap] (http://stackoverflow.com/help/self-answer) tür. – Vincent

+0

eğer bu şekilde görüyorsanız, tamam :) –

İlgili konular