2015-12-20 15 views
9

Bazı ağ iletişimlerini ayrı bir iş parçacığına devretmek için python coroutine numaralı telefondan ThreadPoolExecutor kullanmak istedim.Execute'dan Geleceği Bekleyin: Gelecek 'beklemek' ifadesinde kullanılamaz

from concurrent.futures import ThreadPoolExecutor 
import asyncio 

def work(): 
    # do some blocking io 
    pass 

async def main(): 
    executor = ThreadPoolExecutor() 
    await executor.submit(work) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(main()) 
loop.close() 

nedenleri hatası:

TypeError: object Future can't be used in 'await' expression 

değil Future nesneleri awaitable Are Ancak, aşağıdaki kodu çalıştırarak? Neden olmadıklarını söylüyor?

await bir Future nesnesini executor.submit aracılığıyla iade edebilir miyim?

Python 3.5.0

DÜZENLEME

executor.submit kullanma benim kararım değil. Bu dahili olarak requests-futures gibi çeşitli kütüphaneler tarafından kullanılır. Koroutinlerdeki bu modüllerle birlikte çalışmanın bir yolunu arıyorum. Sen loop.run_in_executor kullanmalıdır

cevap

17

:

from concurrent.futures import ThreadPoolExecutor 
import asyncio 

def work(): 
    # do some blocking io 
    pass 

async def main(loop): 
    executor = ThreadPoolExecutor() 
    await loop.run_in_executor(executor, work) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(main(loop)) 
loop.close() 

DÜZENLEME

concurrent.futures.Future nesne asyncio.Future farklıdır. asyncio.Future, olay döngüleri ile kullanılmak üzere tasarlanmıştır ve değeri, diğeri ise değil. loop.run_in_executor, ikisi arasında gerekli birlikte çalışabilirliği sağlar.

DÜZENLEME # 2

Using executor.submit is not my decision. This is used internally by several libraries, like requests-futures. I am searching for a way to interop with those modules from coroutines.

belgesiz olsa da, bir asyncio.Future bir concurrent.futures.Future dönüştürmek için asyncio.wrap_future(future, *, loop=None) kullanabilirsiniz.

+1

Neden reddedildiğini bilmiyorum. Bu kesinlikle işe yarıyor. Ancak daha fazla ilgileniyorum * neden * yerine * nasıl *. Ayrıca, dahili olarak kullanan futures-istek kitaplığını kullanıyorum. –

+0

Basit * neden * concurrent.futures.Future'ın beklenmedik olması. Asyncio.Future'ı düşünüyorsunuz. –

+0

Tamam, Gelecek adında farklı türlerimiz var. Bu türler arasında bir dönüşüm var mı? –