所以这是我的情景。我有一个python脚本在无限循环中运行,它接受用户输入。
但我现在想要另一个函数每隔n秒执行一次,而主循环(阻塞(等待python的输入()函数))仍在运行。我已经研究过asyncio和调度,但他们似乎不能使用阻塞函数调用,或者我错了?
我已经研究过多处理,但无法完全理解我应该如何做到这一点。
修改
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循环和我的网络守护程序。当我运行它显然有效,但问题是:
(JobChain) > exit
Closing JobChain client now!
alive
alive
alive
我的循环在退出命令之后中断,而且只有其他线程启动,我可能只是错过了一些东西,请纠正我。
答案 0 :(得分:1)
最简单的解决方案是在另一个线程中调用另一个函数(每个 n 秒)。
如果您想使用asyncio,请查看提供input()
的异步等效项的aioconsole
。
修改强>
关于更新的问题,启动线程的正确方法是:
# 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()
答案 1 :(得分:0)
您无法同步阻止用户输入。每个阻塞=阻塞线程,它应该同时处理你的其他请求。
为了从异步编程模式中获得最大收益,您必须在任何地方使用async。
主要思想是拥有一个没有任务阻塞的事件循环。任务应该尽快返回某种承诺,即将来某个时候将通过返回值来实现。然后eventloop可以继续并立即处理您的下一个任务。
如果你真的需要同步阻塞,你应该产生新的线程来做cpu密集型绑定任务。