问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用python的multiprocess多进程

发布网友 发布时间:2022-04-21 16:25

我来回答

2个回答

懂视网 时间:2022-05-10 10:14

本篇文章给大家带来的内容是关于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()}")

执行结果:

2100722135-5bc5ec5af2b28_articlex.png

进程模块

导入模块

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

43052507-5bc89a60aaba3_articlex.png

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

最后的执行结果:

842090432-5bc9d3133aa5a_articlex.png

如果进行文件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())

热心网友 时间:2022-05-10 07:22

#!/usr/bin/env python
# encoding: utf-8

from multiprocessing.mmy import Pool as ThreadPool
import socket
import time

def scan(port):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.settimeout(0.1)
ip='220.181.136.241'
#print port
try:
s.connect((ip,port))
#print port
except:
pass
else:
print 'port is %s',port
s.close()
port=range(10000)
pool=ThreadPool(60)
start=time.time()
results=pool.map(scan,port)
#print results
pool.close()
pool.join()
print time.time()-start
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
华丽转身为什么在优酷看不了了之 《华丽转身:爱情不在服务区》txt全集下载 翡翠台华丽转身英文曲 matplotlib中plt.imshow函数画图出现的颜色问题 数字图像处理(c++ opencv):形态学图像处理-提取连通域 ...opencv做东西,网上的程序读着还可以,程序遇到问题不会改,一些函_百... 深度学习面试问题总结 | 传统图像处理——OpenCV 活虾如何在晚上保持存活状态进行保存? neu代表什么意思 民办学校和私立学校的区别是什么民办学校和私立学校的区别 多核,多进程,多线程对应的英语分别是怎样的 多核,多进程,多线程对应的英语分别是怎样 multiprocessing 和 subprocess 在实质上有什么区别 求个好网名 比较好听的网名 PSD文件的名片怎样转成CDR或者AI文件来印刷 下载 名片 PSD,cdr,ai源文件名片模板设计,哪个网站有下载? 谁有coreldraw名片模板啊~~给我分点,最好是矢量滴 cdr怎么制作名片模板 我想制作名片,该用什么软件? 名片的制作工具和方法 cdr怎么制作名片模板 印刷名片的源文件是位图还是矢量图? 如何制作名片模板 我下载了一个cer文件,一个key文件,怎么使用 如何用Illustrator设计名片?怎么制作名片? vivox20上市时间售价 ps怎样拉出一个六边形?求解? 怎样用PS画标准的正六边形网格啊 ps上怎样把一张照片剪裁成6cm正六边形的? 知道边长用PS怎么画正六边形? 怎样设置multiprocess的后台守护进程 MPS是什么意思? python的multiprocessing到底怎么用的问题 mps是什么概念? Python multiprocessing.Queue 和 Queue有区别吗 R 和 Python 用于统计学分析,哪个更好 Python 开发中有哪些高级技巧 python 和 r 的区别 知乎 python multiprocess runtime error怎么解决 MPS是什么? android项目怎么注册activity MPS 的中文意思 nvidia显卡的选购 有什么方法可以让电脑单核变双核或多核? 微信朋友圈里保存的水印怎么去掉 朋友圈图片有水印怎么去掉 vivo x20 旗舰版什么时候上市 栗子豆腐的功效 栗子豆腐怎么做的 粟子豆腐怎么烧