本文由 DTcms素材网 – DT素材网 发布,转载请注明出处,如有问题请联系我们!Python实现多进程的详解(附示例)
收藏fork函数创建子进程
基本使用
Linux 操作系统提供了一个 fork函数用来创建子进程。fork()位于Python的os模块中。
使用导入os模块即可。
import os os.fork()
每次调用fork()函数后,相应的父进程都会生成一个子进程。
例如下面这段代码:
import os os.fork() os.fork() os.fork()
执行之后将会生成8个进程。
fork()函数的返回值
fork()函数对于子进程的返回值永远是0,而对父进程的返回值则为子进程的pid(进程号)。
实例
#!/usr/bin/env python import os import time rt = os.fork() if rt == 0: print(f"The child process is {os.getpid()} . His father is {os.getppid()}") # os.getpid()获取当前进程进程号,os.getppid()获取当前进程的父进程号 time.sleep(5) else: print(f"The father process is {os.getpid()} . His father is {os.getppid()}") time.sleep(5) print(f"Now the process is {os.getpid()} . His father is {os.getppid()}")
执行结果:
进程模块
导入模块
Python也提供了multiprocessing库给全平台提供了多线程编程。
import multiprocessing
简单进程
下面代码为一个简单进程:
from multiprocessing import Process def work(num): for i in range(10): num += 1 print(num) return 0 def main(): num = 1 p1 = Process(target = work, args = (num,)) p1.start() if __name__ == '__main__': main()
这里从multiprocessing库引入Process这个类。
p1 = Process(target = work, args = (num,))是创建一个进程。target为所要执行任务的函数,args则为接收的参数,必须以元组形式给与。
start()是让进程开始运行。
同时进程有一些方法:
join方法
Process的join方法与多线程类似。为等待进程运行结束。
使用方法:join(timeout)。
使用join(),程序会等待进程结束后再继续进行下面的代码。
如果加入了timeout参数,则程序会等待timeout秒后继续执行下面的程序。
close方法
close()用于关闭进程,但是不能关闭正在运行中的子进程。
进程类
可以通过创建类的方式实现多进程:
from multiprocessing import Process import time class My_Process(Process): def __init__(self,num): Process.__init__(self) self.num = num def run(self): time.sleep(2) print(self.num) def main(): for i in range(10): p = My_Process(i) p.start() if __name__ == '__main__': main()
进程池
from multiprocessing import Pool import time def target(num): time.sleep(2) print(num) def main(): pool = Pool(3) for i in range(3): pool.apply_async(target,(i,)) pool.close() pool.join() print('Finish!!!') if __name__ == '__main__': main()
对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。
Pool(num)里的num为要添加到里面的进程数。不指定进程数,则默认为CPU核心数量。
进程间相互独立
多进程的每一个进程都有一份变量的拷贝,进程之间的操作互不影响。
import multiprocessing import time zero = 0 def change_zero(): global zero for i in range(3): zero = zero + 1 print(multiprocessing.current_process().name, zero) if __name__ == '__main__': p1 = multiprocessing.Process(target = change_zero) p2 = multiprocessing.Process(target = change_zero) p1.start() p2.start() p1.join() p2.join() print(zero)
最后的执行结果:
如果进行文件IO操作,则多进程都会写入同一个文件中。
队列
使用multiprocessing里的Queue可使不同进程访问相同的资源。
from multiprocessing import Process, Queue def addone(q): q.put(1) def addtwo(q): q.put(2) if __name__ == '__main__': q = Queue() p1 = Process(target=addone, args = (q, )) p2 = Process(target=addtwo, args = (q, )) p1.start() p2.start() p1.join() p2.join() print(q.get()) print(q.get())
更多 推荐文章
- 04-17中国首个东盟电子商务平台“美丽湾”启动
- 04-16电商下乡,京东、苏宁、阿里农村遭遇战打响?
- 04-16买房还是炒股,2015年买房无法拒绝的5大理由
- 04-161季度多家房企利润跌幅超50% 去库存促销战打响