- 全局变量:无法在多个进程之间共享
import multiprocessing # 多进程之间不能进行全局变量共享 num = 100 def run(): global num print('子进程开始') num += 10 # print('子进程:', num) print('子进程结束') if __name__ == '__main__': print('主进程开始') p = multiprocessing.Process(target=run) p.start() p.join() print('主进程结束', num)
- 管道
import multiprocessing def run(p_a): # 子进程接收数据 recv = p_a.recv() print('子进程接收到数据:', recv) # 子进程发送数据 p_a.send('world') print('子进程结束') if __name__ == '__main__': # 创建管道 # duplex:是否是全双工,默认为True # 半双工:p_a只能接收数据,p_b只能发送数据 p_a, p_b = multiprocessing.Pipe() # 创建子进程 p = multiprocessing.Process(target=run, args=(p_a,)) p.start() # 主进程发送数据 p_b.send('hello') p.join() # 主进程接收子进程发来的数据 print('主进程结束', p_b.recv())
- 队列
import multiprocessing if __name__ == '__main__': # 创建一个队列,指定容量 q = multiprocessing.Queue(3) # 判断是否为空 print(q.empty()) # 向队列中添加数据 q.put('how') q.put('are') q.put('you') # 判断是否已满 print(q.full()) # 若队列已满,再放数据则会阻塞 # q.put('hello') # 若队列已满,则会崩溃 # q.put_nowait('hello') # 获取数据 print(q.get()) # print(q.qsize()) print(q.get()) print(q.get()) # 若队列已空,再获取数据会阻塞 # print(q.get()) # 若队列已空,再获取数据会崩溃 # print(q.get_nowait()) # 队列长度(队列中的数据数量) print(q.qsize()) # 队列关闭 q.close()
自定义进程类
- 说明:将进程处理封装成类,要求继承自
multiprocessing.Process
- 示例:
from multiprocessing import Process import time class DownloadProcess(Process): def __init__(self, file): super().__init__() self.file = file # 在调用start方法后会自动调用 # 改方法就是进程任务,无需单独指定 def run(self): print('{}文件开始下载'.format(self.file)) for i in range(1, 6): time.sleep(1) print('进度{}%'.format(i * 20)) print('{}文件下载完成'.format(self.file)) if __name__ == '__main__': print('主进程开始') dp = DownloadProcess('meinv.jpg') dp.start() dp.join() print('主进程结束')
练习
- 使用队列完成进程之间的数据共享
- 预习线程操作
标签: python
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~