阻塞while循环的异步执行

时间:2018-02-19 11:31:43

标签: python asynchronous python-asyncio

所以这是我的情景。我有一个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

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

2 个答案:

答案 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密集型绑定任务。