我想象asyncio
能够在后台启动一个进程,而不会阻塞任务的执行流程。毕竟,文档声明asyncio.create_task
调度任务的执行,并给出了一个“可靠的‘发射和忘记’后台任务”的示例,它逐个创建和调度任务。
我想使用asyncio
来接受输入,并开始解析命令,同时仍然接受进一步的输入。下面是一个简单的例子:
import asyncio
from time import sleep
class Test:
def __init(self):
self.calculating = False
def calculate(self):
# begin "calculation"
n = 0
self.calculating = True
while self.calculating:
sleep(1)
n += 1
print(n)
self.calculating = False
def stop(self):
# causes calculation to end
self.calculating = False
async def parse(self, cmd):
if cmd == "begin":
self.calculate()
elif cmd == "stop":
self.stop()
async def main():
t = Test()
while True:
cmd = input()
task = asyncio.create_task(t.parse(cmd))
await task
if __name__ == "__main__":
asyncio.run(main())
字符串
如果不等待任务,则永远不会解析命令。等待任务确实使“计算”在输入“begin”时开始,正如预期的那样。但是,任务是阻塞的,因此用户永远没有机会输入停止命令。
我看到的asyncio的例子是在运行事件循环之前已知要计算的问题。例如,打开并下载给定的站点列表。这可以通过asyncio.gather方法在一堆任务上完成。但这并不完全是我的情况,我很惊讶没有大量的例子适合我的用例。
我做错了什么?我可能不会按预期使用asyncio吗?或者我使用input()
和print()
是错误的,其他一些替代方案更合适(即:日志记录)?
1条答案
按热度按时间gudnpqoy1#
用
concurrent.futures.ThreadPoolExecutor
和threading.Event
计算出来的。字符串
怪癖:
input()
对话框以某种方式显示在应该跟随它的打印语句之后(即"Stopping future\n{n}\nCommand: "
)的最大值我仍然不完全理解为什么
asyncio
不适合这个问题,而这个实现是。我很乐意听到任何关于这一点的解释,或者我经历的怪癖。感谢thomashle的
sunfish
为the example。