2017-12-24 24 views
1

なぜasyncioキューは、そこに項目を置いても空であるにもかかわらず、奇妙な挙動をしているのですか?asyncioキューの奇妙な振る舞い

In [1]: from multiprocessing import Queue 

In [2]: q = Queue() 

In [3]: q.empty() 
Out[3]: True 

In [4]: q.put(100) 

In [5]: q.empty() 
Out[5]: False 

In [6]: from asyncio import Queue 

In [7]: q = Queue() 

In [8]: q.empty() 
Out[8]: True 

In [9]: q.put(100) 
Out[9]: <generator object Queue.put at 0x7f97849bafc0> 

In [10]: q.empty() 
Out[10]: True 

答えて

3

あなたは何も入れていないので:ここ

q.put(100) 

putを - それはcoroutineだ、プレーンな関数ではありません。あなたはキューに項目を入れるにはshouldawaitです。例えば

:ミハイル・Gerasimovの答えとして

import asyncio 
from asyncio import Queue 


async def main(): 
    q = Queue() 

    print(q.empty()) # True 

    await q.put(100) 

    print(q.empty()) # False 


if __name__ == '__main__': 
    loop = asyncio.get_event_loop() 
    try: 
     loop.run_until_complete(main()) 
    finally: 
     loop.run_until_complete(loop.shutdown_asyncgens()) 
     loop.close() 
0

q.put(100)coroutineと詳細を説明するが...

コルーチンを呼び出すと、そのコードの実行を開始しません - コルーチン オブジェクトあなたがその の実行をスケジュールするまで、呼び出しによって返されたものは何もしません。それを実行するには、基本的に2つの基本的な方法があります: コルーチンをコールするか、 のコルーチンがすでに実行されていると仮定して、コルーチンからコルーチンを取得するか、 ensure_future()関数またはAbstractEventLoop.create_task( ) メソッド。

コルーチン(およびタスク)は、イベントループの実行中にのみ実行できます。

Python Coroutines docです。

ミハイルGerasimovの例では、 別coroutineasync def main()コールcoroutineq.put(100)awaitとイベントループは、上記の説明のようにloop.run_until_complete(main())を実行しています。