2020年6月24日 / 630次阅读 / Last Modified 2020年6月24日
subprocess模块,多进程
先说一下自己对Python的subprocess模块和multiprocessing模块不一样地方的理解吧。
subprocess是使用一行shell命令来启动进程,同步异步都可以。multiprocessing是用一个代码入口启动进程,并提供了更加丰富的进程间信息交互和同步的方式。
我有一个需求,是需要在python代码中,直接创建一个后台进程,不能因为Ctrl-C或者关闭shell窗口,使这个后台进程退出。在multiprocessing模块中找了一圈,没有发现相关的接口,不过subprocess模块帮我实现了这一个需求。
因为subprocess模块是用调用shell命令的方式创建进程,我们可以直接用这一行shell命令启动后台进程。
$ cat test.py
import subprocess
subprocess.Popen('python3.8 start.py', shell=True)
如上示例,test.py的执行,就是启动一个新的python进程,然后自己就退出了。这个新的python进程,就成了后台进程,logout后也依然存在。这个命令行,连nohup都不需要!
不过,有个小细节,用这种方式启动的后台进程,父进程是一个sh,sh上面就是systemd:
$ pstree
systemd─┬─2*[agetty]
├─alsactl
├─avahi-daemon───avahi-daemon
├─bluetoothd
├─cron
├─dbus-daemon
├─dhcpcd
├─hciattach
├─rngd───3*[{rngd}]
├─rsyslogd───3*[{rsyslogd}]
├─sh───python3.8─┬─python3.8
│ └─{python3.8}
├─sshd───sshd───sshd───bash───pstree
├─systemd───(sd-pam)
├─systemd-journal
├─systemd-logind
├─systemd-timesyn───{systemd-timesyn}
├─systemd-udevd
├─thd
└─2*[wpa_supplicant]
-- EOF --
本文链接:https://www.pynote.net/archives/2088
前一篇:python进程间通信之Pipe
后一篇:用python控制树莓派的GPIO
Ctrl+D 收藏本页
©Copyright 麦新杰 Since 2019 Python笔记