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---')
浙公网安备 33010602011771号