我有一个情况,我有一个“服务器”线程,应该监听来自其他服务器线程的调用/事件,同时执行一些其他代码。最近我已经大量使用Node.js,所以我想使用async/await创建一个事件循环,在其中等待其他线程加入事件循环,并在它们最终加入时处理它们的响应。
为了测试这个想法,我在Python 3.5中编写了以下测试脚本:
在这个例子中,我想启动三个不同字符串的工作线程,并等待它们完成。工作线程会随机休眠一段时间,因此当多次运行脚本时,它们应该以随机顺序完成。但实际上它们似乎是按顺序执行的,第二个线程在第一个线程之后开始。
我的错误在哪里?难道睡眠只会阻塞当前线程吗?我的事件循环设置正确吗?我能否使用async/await来加入线程?
最终,我想向其他线程发送消息并等待它们的响应,然后使用返回值运行回调函数。
编辑:为了澄清,最终我想在主线程中使用async/await等待条件变量,直到有些条件变量允许执行通过。在这个示例代码中,我试图使用工作线程的join做同样的事情。
为了测试这个想法,我在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()
在这个例子中,我想启动三个不同字符串的工作线程,并等待它们完成。工作线程会随机休眠一段时间,因此当多次运行脚本时,它们应该以随机顺序完成。但实际上它们似乎是按顺序执行的,第二个线程在第一个线程之后开始。
我的错误在哪里?难道睡眠只会阻塞当前线程吗?我的事件循环设置正确吗?我能否使用async/await来加入线程?
最终,我想向其他线程发送消息并等待它们的响应,然后使用返回值运行回调函数。
编辑:为了澄清,最终我想在主线程中使用async/await等待条件变量,直到有些条件变量允许执行通过。在这个示例代码中,我试图使用工作线程的join做同样的事情。
time.sleep
不是异步的,请尝试使用await asyncio.sleep
。 - jonrsharpe