[英]Python asyncio simple example
我正在尝试使用python的asyncio协议。 我从官方文档中找到了此示例 ,并希望对其进行稍作修改并重现其行为。 所以我写了以下两个脚本:
# file: get_rand.py
from random import choice
from time import sleep
def main():
print(choice('abcdefghijklmnopqrstuvwxyz'))
sleep(2)
if __name__ == '__main__':
main()
和:
# file: async_test.py
import asyncio
class Protocol(asyncio.SubprocessProtocol):
def __init__(self, exit_future):
self.exit_future = exit_future
self.output = bytearray()
print('Protocol initialised')
def pipe_data_received(self, fd, data):
print('Data received')
self.output.extend(data)
#def pipe_connection_lost(self, fd, exc):
# print('Pipe connection lost for the following reason:')
# print(exc)
def subprocess_exited(self):
print('Subprocess exited')
self.exit_future.set_result(True)
@asyncio.coroutine
def get_rand(loop):
exit_future = asyncio.Future(loop=loop)
print('Process created')
created = loop.subprocess_exec(lambda: Protocol(exit_future),
'python3.5', 'get_rand.py',
stdin=None, stderr=None)
print('Getting pipes...')
transport, protocol = yield from created
print('Waiting for child to exit...')
yield from exit_future
transport.close()
print('Gathering data...')
data = bytes(protocol.output)
print('Returning data...')
return data.decode('ascii').rstrip()
def main():
loop = asyncio.get_event_loop()
print('Event loop started')
data = loop.run_until_complete(get_rand(loop))
print('Event loop ended')
print(data)
loop.close()
if __name__ == '__main__':
main()
当我运行async_test.py时,我得到以下输出:
$ python3.5 async_test.py
Event loop started
Process created
Getting pipes...
Protocol initialised
Waiting for child to exit...
Data received
它只是挂起。
如果取消注释pipe_connection_lost
方法,则输出如下:
$ python3.5 async_test.py
Event loop started
Process created
Getting pipes...
Protocol initialised
Waiting for child to exit...
Data received
Pipe connection lost for the following reason:
None
而且该过程仍然挂起。 我认为这是由于某种原因,子进程( get_rand.py
)关闭了管道(如上面的输出所示),但是没有终止,因此父yield from exit_future
可以yield from exit_future
。 考虑到我的代码主要是从python文档中的示例复制粘贴的,因此我真的不理解此行为的原因。
更改def subprocess_exited(self):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.