share-image
ESC

python 的多进程

还是最近写的自动回复用户问题的机器人,一开始都是启动一个进程在跑,但是这样有个缺点,就是所有的函数都必须在几乎同一时间执行,但是我希望三个函数分别需要在1分钟调用一次,2分钟调用一次,30分钟调用一次。但是写一个死循环也只能在某个时间内同时调用,这显然不符合我的需求,于是我希望把这三个方法都实现死循环的方式,但是每个方法执行完毕后等待的时间不一样。

这个需求就需要使用到多进程了。在操作系统中,一个进程默认只有一个线程在工作,也就是说你所有的程序都是在进程上面的线程里执行的,那我这个需求很显然使用一个进程跑是不能满足的,需要使用多个进程并行完成。

Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。

ss
子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。

Python的os模块封装了常见的系统调用,其中就包括fork,但是 fork 只能在 unix 系统使用,如果要实现跨平台需要使用multiprocessing 模块

先导入包

from multiprocessing import Process

然后看下代码

def do_run_1(self):

while 1:
print('Parent process pending %s.' % os.getpid())

time.sleep(1800)

def do_run_2(self):
while 1:
print('Parent process new %s.' % os.getpid())
time.sleep(60)
def do_run_3(self):
while 1:
print('Parent process open %s.' % os.getpid())
time.sleep(300)

def main(self):
p1 = Process(target=kf5.do_run_1)
p1.start()
p2 = Process(target=kf5.do_run_2)
p2.start()
p3 = Process(target=kf5.do_run_3)
p3.start()

if __name__ == '__main__':

kf5 = kf5API()
kf5.main()


这样就实现了3个进程同时跑

[root@centos ~]# ps aux | grep xxx.py
root 3502 0.0 0.2 208876 17860 pts/2 S+ 17:38 0:00 python3 /opt/xxx.py
root 3506 0.0 0.1 208876 14300 pts/2 S+ 17:38 0:00 python3 /opt/xxx.py
root 3507 0.0 0.1 208876 14308 pts/2 S+ 17:38 0:00 python3 /opt/xxx.py
root 3508 0.0 0.2 214392 17972 pts/2 S+ 17:38 0:00 python3 /opt/xxx.py

文章作者:阿文
文章链接: https://www.awen.me/post/7020.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿文的博客
本文于 2018-04-27 发布,已超过半年(2834天),请注意甄别内容是否已过期。