还是最近写的自动回复用户问题的机器人,一开始都是启动一个进程在跑,但是这样有个缺点,就是所有的函数都必须在几乎同一时间执行,但是我希望三个函数分别需要在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