一、实现方式
import time
import multiprocessing #进程相关包
#使用进程完成多任务
def fun1():
while True:
print("…………fun1")
time.sleep(1)
def fun2():
while True:
print("…………fun2")
time.sleep(1)
def main():
p1 = multiprocessing.Process(target=fun1) #创建新的线程对象
p2 = multiprocessing.Process(target=fun2)
p1.start() #开启子进程
p2.start()
if __name__ == "__main__":
main()
二、使用队列Queue完成多进程之间的通信
import multiprocessing #进程相关包
"""
使用队列(Queue)实现进程间通信
"""
#队列演示(可以实现进程间解耦)
# class MyQueue(object):
#
# def my_queue(self):
# q = multiprocessing.Queue(3) #声明队列的长度,不初始化,默认最大(根据机器有所不同)
# q.put("消息1")
# q.put(222)
# q.put([1, 2, 1]) #放入队列中的数据类型可以不同
# q.put(34543) #放入的数据超过队列长度,会阻塞,等待队列中有新的位置
# q.put_nowait(213123) #放入的数据超过队列长度,不会阻塞,抛出异常
# print(q.full()) #判断队列是否已满
# print(q.get())
# print(q.get())
# print(q.full())
# print(q.get())
# print(q.empty()) #判断队列是否为空
# q.get() #如果队列为空,会阻塞,一直等待队里中在此有数据
# q.get_nowait() #队列为空,不会等待,抛出异常
def fun1(q):
data = [1, 2, 3, 4, 5]
for temp in data:
q.put(temp)
print("写入数据!")
def fun2(q):
data = list() #创建一个空列表的另一种方式
while True:
if not q.empty():
data.append(q.get())
else:
print(data)
break
def main():
# mq = MyQueue()
# mq.my_queue()
#创建一个队列
q = multiprocessing.Queue()
#创建多个进程,将队列的引用传给函数
p1 = multiprocessing.Process(target=fun1, args=(q,))
p2 = multiprocessing.Process(target=fun2, args=(q,))
p1.start()
p2.start()
if __name__ == "__main__":
main()
三、进程池
# -*- coding:utf-8 -*-
from multiprocessing import Pool
import os, time, random
"""
进程池
"""
def worker(msg):
t_start = time.time()
print("%s开始执行,进程号为%d" % (msg, os.getpid()))
# random.random()随机生成0~1之间的浮点数
time.sleep(random.random() * 2)
t_stop = time.time()
print(msg, "执行完毕,耗时%0.2f" % (t_stop - t_start))
def main():
po = Pool(3) # 定义一个进程池,最大进程数3
for i in range(0, 10):
# Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
# 每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker, (i,))
print("----start----")
po.close() # 关闭进程池,关闭后po不再接收新的请求
po.join() # 等待po中所有子进程执行完成,必须放在close语句之后
print("-----end-----")
if __name__ == '__main__':
main()