python:创建一个分离的进程并通过命令行与它通信

时间:2018-04-27 12:06:07

标签: python asynchronous

我想创建一个命令行工具,它是一个倒数计时器,带有我需要的一些自定义功能。

我的想法是使用python脚本启动一个在后台工作的进程(例如,在接近结尾时播放声音)。一旦计时器进程正在运行,我想通过命令行与它进行通信(发送查询,例如“剩下的'或者像'启动XXmin'以及'停止' )。当然,应该只有一个定时器进程实例。

用法可能看起来像

>>> timer start 25min

>>> timer remaining
17:34 min remaining

>>> timer stop
timer stopped.

>>> timer start 90sec

在等待邮件到达时,计时器进程需要做什么才能完成工作?反过来,接口脚本需要做什么来启动进程并在以后与之通信?使用单独的流程是实现目标的最佳方法吗?

我不知道如何去做。我的想法听起来很简单,但我发现的几乎所有内容都与父脚本的子进程的并发性有关,这不是我想要的。

谢谢。

2 个答案:

答案 0 :(得分:1)

简单的方法是在shell中使用connection.php在后​​台执行脚本。然后只用USR1和USR2信号与过程进行通信。

在Python中,我想最简单的方法是使用守护进程模块。

&

或者你可以import daemon def do_something(): pass if __name__ == "__main__": with daemon.DaemonContext(): do_something() 你自己的守护进程。

fork()

然后,例如,您可以使用import os def doSomething(): pass def createDaemon(): try: # Store the Fork PID pid = os.fork() if pid > 0: print 'PID: %d' % pid os._exit(0) os.chdir("/") os.setsid() os.umask(0) except OSError, error: print 'Unable to fork. Error: %d (%s)' % (error.errno, error.strerror) os._exit(1) doSomething() 与该守护进程进行通信。在这个简单的例子中,在* nix系统上,甚至只是信号。

另一种选择是使用multiprocessing模块来创建守护进程并与之通信。

答案 1 :(得分:1)

您在这里寻找的是基本的客户端 - 服务器架构。您需要两个程序 - 一个在后台运行并侦听消息(服务器),另一个程序向服务器发送消息,并对响应(客户端)执行某些操作。

有一些很多方法可以做到这一点,而且这个区域非常复杂,所以不要指望它非常简单。刚刚开始时,我建议您尝试使用标准库(http server module)来使用简单的http.server服务器。对于客户端,我建议requests library。对于本地客户端 - 服务器设置而言,HTTP绝对不是最佳选择,但对于现有的库,它是最容易启动和运行的,并且一旦您对此感到满意,如果你愿意,你可以考虑其他方法。