У меня есть ситуация, когда у меня есть «серверный» поток, который должен прослушивать вызовы/события из других потоков сервера и одновременно выполнять какой-то другой код. В последнее время я много работал с Node.js, поэтому я подумал, что было бы неплохо использовать async/await для создания цикла событий, где я могу подождать другие потоки, чтобы присоединиться к циклу событий и обработать их ответ, когда они, наконец, присоединятся.Python asyncio wait for threads
Чтобы проверить эту идею, я написал следующий тестовый скрипт в 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()
В примере я хочу пнуть три рабочие потоки с разными строками и ждать их, чтобы закончить. Рабочие спят случайное количество времени, поэтому я ожидаю, что они закончатся в случайном порядке, когда скрипт запускается несколько раз. Оказывается, что они, похоже, исполняются последовательно, второй поток начинается с первого раза.
Какая у меня ошибка? Не следует ли спящать блок только в том потоке, в котором он находится? Правильно ли настроен цикл событий? Могу ли я подключиться к асинхронному подключению?
В конечном итоге я хочу отправлять сообщения в другие темы и ждать их ответа, а затем запустить функцию обратного вызова с возвращенным значением.
EDIT: Чтобы уточнить, в конечном счете, я хочу подождать условных переменных с async/await в моем основном потоке и запустить другой код до тех пор, пока некоторые условные переменные не смогут выполнить выполнение. В этом примере кода я пытался сделать то же самое с соединением рабочего потока.
'time.sleep' не является асинхронным, попробуйте его с помощью' await asyncio.sleep' – jonrsharpe
Но он запускается в отдельном потоке, поэтому не следует просто блокировать отдельный поток вместо основного потока, где цикл события является? Я понимаю, что сон - это поток, а не блокирование процесса. Итак, зачем присоединяться к моей основной теме, даже с структурой async/wait? – Tumetsu