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