一般比较流行的都是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——通过multiprocessing模块实现多进程,subpreocess实现多个程序同时运行_多进程

注意

如果这此处不加​​python XXXX.py​​,则会报以下错误:

python——通过multiprocessing模块实现多进程,subpreocess实现多个程序同时运行_数据_02