我有一個情況,我有一個「服務器」線程應該監聽來自其他服務器線程的調用/事件,同時執行一些其他代碼。最近我在Node.js上做了很多工作,所以我認爲使用async/await創建一個事件循環會很好,我可以等待其他線程加入事件循環,並在最終加入時處理它們的響應。Python asyncio等待線程
爲了驗證這一想法我在Python 3.5寫了下面的測試腳本:
# 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()
在我想踢了與不同的字符串三個工作線程,並等待他們完成的例子。工作人員睡眠的時間是隨機的,因此當腳本運行多次時,我希望他們按隨機順序完成。原來,他們似乎順序執行,第二個線程開始之後。
我在這裏有什麼錯誤?不應該睡覺只阻擋它所在的線程嗎?我的事件循環是否設置正確?我可以異步/等待連接嗎?
最終,我想發送消息到其他線程,並等待他們的迴應,然後運行帶有返回值的回調函數。
編輯:澄清,最終我想等待在我的主線程中的異步/等待條件變量,並運行其他代碼,直到某些條件變量讓執行通過。在這個示例代碼中,我試圖對工作線程的連接做同樣的事情。
'time.sleep'不是異步的,可以用'await asyncio.sleep'嘗試它 – jonrsharpe
但是它是在一個單獨的線程中觸發的,所以不應該只是阻塞單獨的線程而不是主線程的事件循環是什麼?我的理解是,睡眠是線程,而不是過程阻塞。那麼,爲什麼連接我的主線程,即使是異步/等待結構? – Tumetsu