他のコードを実行しながら同時に他のサーバースレッドからコール/イベントを聴くべき "サーバー"スレッドがある状況があります。最近、私はNode.jsで多くの作業をしていますので、非同期/待機を使用してイベントループを作成して、イベントループで他のスレッドが待機して最終的に参加するときの応答を処理できるようにすることをお勧めします。私は別の文字列と3つのワーカースレッドをキックオフし、それらが終了するのを待ちたいスレッドを待つPython asyncio
# http://stackabuse.com/python-async-await-tutorial/
# Testing out Python's asynchronous features
import asyncio
from time import sleep
import threading
from threading import Thread
import random
class MyThread(Thread):
def __init__(self, message):
Thread.__init__(self)
self._message = message
def run(self):
self._return = self._message + " oli viesti"
a = random.randint(1, 5)
print("Sleep for ", a)
sleep(a)
print("Thread exiting...")
def join(self):
Thread.join(self)
return self._return
async def send(message):
t = MyThread(message) # daemon = True
t.start()
print("asd")
return t.join()
async def sendmsg(msg):
response = await send(msg)
print("response is ", response)
if __name__ == "__main__":
# Initiate a new thread and pass in keyword argument dictionary as parameters
loop = asyncio.get_event_loop()
tasks = [
asyncio.ensure_future(sendmsg("hippa1"), loop=loop),
asyncio.ensure_future(sendmsg("hippa2"), loop=loop),
asyncio.ensure_future(sendmsg("hippa3"), loop=loop)
]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
の例では:私は、Python 3.5で、次のテストスクリプトを書いたアイデアをテストする
。労働者は無作為に時間を寝るので、スクリプトを複数回実行するとランダムな順番で終了すると思います。最初のスレッドの後に2番目のスレッドが順番に実行されるように見えることが分かります。
ここで私のエラーは何ですか?スレッドをスリープ状態にしないでください。私のイベントループは正しく設定されていますか?ジョインを非同期/待機することはできますか?
最終的に私は他のスレッドにメッセージを送り、その応答が返された値でコールバック関数を実行するのを待ちます。
編集:明確にするために、最終的に私のメインスレッドで条件変数をasync/awaitで待って、条件変数のいくつかが実行されるまで他のコードを実行したい。このコード例では、ワーカースレッドの結合で同じことをしようとしていました。
'time.sleep'は非同期ではありませんが、' await asyncio.sleep'で試してください – jonrsharpe
しかし別のスレッドでトリガされるので、イベントループのメインスレッドではなく別のスレッドをブロックしてはいけませんありますか?私の理解は、スリープはスレッドであり、プロセスのブロックではないということです。だから、なぜjoinブロックがasync/await構造であってもメインスレッドをブロックするのですか? – Tumetsu