Python 如何同步两个trio co例程?
我正在经历,我做了一个向一个发送信息10秒的程序:Python 如何同步两个trio co例程?,python,python-3.x,python-trio,Python,Python 3.x,Python Trio,我正在经历,我做了一个向一个发送信息10秒的程序: async def sender(client_stream, flag): print("sender: started!") end_time = time.time() + 10 while time.time() < end_time: data = b"async can sometimes be confusing, but I believe in you
async def sender(client_stream, flag):
print("sender: started!")
end_time = time.time() + 10
while time.time() < end_time:
data = b"async can sometimes be confusing, but I believe in you!"
print("sender: sending {!r}".format(data))
await client_stream.send_all(data)
await trio.sleep(0)
flag = False
print("Left the while 10 seconds loops")
问题是,由于变量标志
的并发性问题,有时程序挂起在第行data=wait client\u stream.receive\u some()
如何从发送方
协同例程向接收方
协同例程发送信号
这是您可以运行的。它不只是有时挂起,它一直挂起,因为
receiver()
中的标志
变量从未更改。我想你的印象是,它是在receiver()
和sender()之间共享的。不是
解决此问题的最简单方法是将其传递到容器中:
async def sender(client_stream, flag):
print("sender: started!")
end_time = time.time() + 10
while time.time() < end_time:
data = b"async can sometimes be confusing, but I believe in you!"
print("sender: sending {!r}".format(data))
await client_stream.send_all(data)
await trio.sleep(0)
flag[0] = False
print("Left the while 10 seconds loops")
async def receiver(client_stream, flag):
print("receiver: started!")
while flag[0]:
data = await client_stream.receive_some()
print("receiver: got data {!r}".format(data))
print("receiver: connection closed")
sys.exit()
async def start_server():
print("parent: connecting to 127.0.0.1:{}".format(PORT))
client_stream = await trio.open_tcp_stream("127.0.0.1", PORT)
flag = [False]
async with client_stream:
async with trio.open_nursery() as nursery:
print("parent: spawning sender...")
nursery.start_soon(sender, client_stream, flag)
print("parent: spawning receiver...")
nursery.start_soon(receiver, client_stream, flag)
请注意,您甚至不需要sys.exit()
程序就可以结束。第二种解决方案不允许接收者有时间读取所有发送者的消息
async def sender(client_stream, flag):
print("sender: started!")
end_time = time.time() + 10
while time.time() < end_time:
data = b"async can sometimes be confusing, but I believe in you!"
print("sender: sending {!r}".format(data))
await client_stream.send_all(data)
await trio.sleep(0)
flag[0] = False
print("Left the while 10 seconds loops")
async def receiver(client_stream, flag):
print("receiver: started!")
while flag[0]:
data = await client_stream.receive_some()
print("receiver: got data {!r}".format(data))
print("receiver: connection closed")
sys.exit()
async def start_server():
print("parent: connecting to 127.0.0.1:{}".format(PORT))
client_stream = await trio.open_tcp_stream("127.0.0.1", PORT)
flag = [False]
async with client_stream:
async with trio.open_nursery() as nursery:
print("parent: spawning sender...")
nursery.start_soon(sender, client_stream, flag)
print("parent: spawning receiver...")
nursery.start_soon(receiver, client_stream, flag)
async def sender(client_stream):
print("sender: started!")
data = b"async can sometimes be confusing, but I believe in you!"
with trio.move_on_after(10):
print("sender: sending {!r}".format(data))
await client_stream.send_all(data)
await client_stream.aclose()
print("Left the while 10 seconds loops")
async def receiver(client_stream):
print("receiver: started!")
try:
async for data in client_stream:
print("receiver: got data {!r}".format(data))
except trio.ClosedResourceError:
print("receiver: connection closed")