python——通过multiprocessing模块实现多进程,subpreocess实现多个程序同时运行
原创
©著作权归作者所有:来自51CTO博客作者IrvingGao的原创作品,请联系作者获取转载授权,否则将追究法律责任
一般比较流行的都是multiprocessing库来实现多线程,博主在看书的时候看到了有相关subpreocess的教程,使用思路相同,读者可自行选用。
multiprocessing实现多进程
简单实现
import multiprocessing
def Aptag_cap():
(省略具体内容)........
return Aptag_list
#定义线程
cap0_process = multiprocessing.Process(target=Aptag_cap, args=[cap0])
#运行线程
cap0_process.run()
获得线程返回值(只能是字符串、列表、字典等信息)
pool方式
- 直接使用
pool.apply_async()
运行进程即可 - 通过
pool.apply_async().get()
获取该进程运行的返回值
本来想通过pool.apply_async().get()获得opencv读取摄像头的返回值,但是报错说不支持摄像头获取的数据,所以读者朋友也记得不要用该函数去获取摄像头的图片返回值。
#定义线程池,有几个线程,一般自己有几个程序就定义几个线程
pool = multiprocessing.Pool(processes=3)
#通过pool.apply_async().get()获得函数返回值
t = pool.apply_async(Aptag_only_detect, args=[ret, frame]).get()
pipe方式
- 定义方式为:
(con1, con2) = multiprocessing.Pipe()
,前两个参数分别为pipe的发送方法con1和接收方法con2 - 通过
pipe.send()
实现向管道中发送数据 - 通过
pipe.recv()
实现向管道中接收数据
需要注意的是,pipe只适用于程序中只有两个进程的情况,pipe只支持2个进程之间进行通信,不支持多个进程。
(con1, con2) = multiprocessing.Pipe()
def Aptag_cap(pipe):
(省略具体内容)........
pipe.send(Aptag_list)
cap0_process = multiprocessing.Process(target=Aptag_detect, args=[cap1, con1])
cap0_process.run()
print("con2 got: %s" % con2.recv())
queue方式
- 通过
queue.put()
实现数据放在队列中 - 通过
queue.get()
实现数据从队列中拿出并删除,其顺序遵循先放入,先拿出
queue好像是基于pipe开发的,但是queue可以适用于单个程序中多个进程的通信任务。
queue = multiprocessing.Queue()
cap0_process = multiprocessing.Process(target=Aptag_detect, args=[cap1, queue])
cap0_process.run()
Aptag_list = queue.get()
subprocess实现多进程(打开多个exe文件等)
subprocess.Popen()简单实现
import subprocess
sliderProcess = subprocess.Popen('python opencv/HSV_slider.py')
vedioProcess = subprocess.Popen('python opencv/video_show.py')
print(sliderProcess)
print(vedioProcess)
效果
可以同时打开两个python程序:
注意
如果这此处不加python XXXX.py
,则会报以下错误: