本篇文章给大家带来的内容是关于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实现多进程的详解(附示例)

进程模块

导入模块

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()

Python实现多进程的详解(附示例)

这里从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)

最后的执行结果:

Python实现多进程的详解(附示例)

如果进行文件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())
标签
DT素材网

DT素材网

132

0

0

( 此人很懒并没有留下什么~~ )