带阻塞while循环的异步执行

2024-05-15 15:48:38 发布

您现在位置:Python中文网/ 问答频道 /正文

这就是我的设想。我有一个python脚本,它在一个接受用户输入的无限while循环中运行。在

但现在我希望在主循环阻塞(等待python的input()函数)仍在运行时,每隔n秒就有另一个函数执行一次操作。我已经研究过asyncio和scheduling,但它们似乎不适用于阻塞函数调用,还是我搞错了?在

我已经研究过多处理,但还不能确定我到底应该如何做。在

编辑:

if __name__ == "__main__":
    def survivor():
        count = 5
        while count:
            print("alive")
            time.sleep(8)
            count -= 1
        print("done")


    test = JobChainClient()

    cli = threading.Thread(name="cli", target=test.getShell())
    network = threading.Thread(name="network", target=survivor())

    cli.start()
    network.start()
    print("Done")

这段代码获取了我的CLI(一个无限while循环)和我的网络守护程序。当我运行这个程序时,它显然有效,但问题是:

^{pr2}$

我的循环在exit命令后中断,只有其他线程才启动,我可能只是错过了一些东西,请纠正我。在


Tags: 函数nametest程序targetclicountnetwork
2条回答

最简单的解决方案是在单独的线程中调用另一个函数(每隔n秒执行一次操作)。在

如果您想使用asyncio,请查看^{},它提供了input()的异步等价物。在

编辑
关于更新后的问题,启动线程的正确方法是:

# note the lack of parentheses after `getShell` - you only
# want to refer to the function, not to call it (yet)
cli = threading.Thread(name="cli", target=test.getShell)
cli.start()

用户不能同步输入。每个阻塞=阻塞线程,它应该同时处理您的其他请求。在

为了从异步编程模式中获得最大的收益,您必须在任何地方使用异步。在

其主要思想是有一个事件循环,其中没有任务被阻塞。任务应该尽快返回某种承诺,即在将来的某个时候,它将通过返回值来实现。然后eventloop可以继续并立即处理下一个任务。在

如果您真的需要同步阻塞,您应该生成新的线程来执行cpu密集型的绑定任务。在

相关问题 更多 >