python-多进程

进程的创建-multiprocessing

multiprocessing模块是跨平台的多进程模块,提供了Process类来代表一个进程对象

import multiprocessing
import time


def test1():
    for i in range(5):
        print(i)
        time.sleep(1)
        
        
def test2():
    for i in range(5):
        print(i)
        time.sleep(1)
        
def main():
    p1 = multiprocessing.Process(target=test1)
    p2 = multiprocessing.Process(target=test2)
    
    p1.start1()
    p2.start2()

if __name__ == "__main__":
    main()

进程和线程的区别

  • 一个程序至少有一个进程,一个进程至少有一个线程
  • 线程的划分尺度小于进程(资源比进程少),使得多线程程序并发性高
  • 进程在执行过程中拥有独立的内存单元,二多个线程共享内存,从而极大地提高了程序的运行效率
  • 线程不能够独立执行,必须已存在进程中

进程间的通信-Queue

Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信

Queue的使用

可以使用multiprocessing模块的Queue实现多线程之间的数据传递,Queue本身是一个消息队列程序

#coding=utf-8
from multiprocessing import Queue

q = Queue(3)  # 初始化一个Queue对象,最多可接受三条put消息
q.put('消息1')  # 往消息队列发送消息
q.put('消息2')
print(q.full())  # 如果消息队列满了,则返回True,否则FALSE

q.get()  # 接受消息队列
q.empty()  # 如果消息队列为空,则返回True,否则FALSE

进程池

# conding=utf-8
from multiprocessing import Pool
import os,time,random

def worker(msg):
    t_start = time.time()
    print("%s开始执行,进程号为%d" % (msg, os.getpid()))
    time.sleep(random.random()*2)
    t_stop = time.time()
    print(msg,"执行完毕,耗时%0.2f" % (t_stop-t_start))
    
po = Pool(3)  # 定义一个进程池,最大进程数3  如果不填写,则默认最大
for i in range(10):
    # Pool.apply_async(要调用的目标,(传递给目标的参数元祖,))
    # 每次循环将会用空闲出来的子进程去调用目标
    po.apply_async(worker, (i,))
    
print("--start--")
po.close()  # 关闭进程池,关闭后po不再接受新的请求
po.jion()  # 等待po中所有子进程执行完成,必须放在close后
print('---end---')

posted on 2021-04-08 21:14  C_yuyan  阅读(60)  评论(0)    收藏  举报