一、多进程包引用
import multiprocessing
二、多进程启动方式
multiprocessing支持三种启动进程的方法:spawn/fork/forkserver。
一般情况下使用spawn。
三、多进程的创建函数
multiprocessing.Process()
四、关于多进程参数传递
1、args
multiprocessing.Process(target=*,args=(*,))
注意这个参数中逗号
2、kwargs
multiprocessing.Process(target=*,kwargs={"变量名": 变量值})
五、关于多进程数据同步
multiprocessing.Queue是一种安全多进程数据同步变量
六、运行方式
process.daemon = True
是否以后台方式运行服务
七、多进程结束
for process in processes:
process.join()
主进程会等待所有的子进程执行结束再结束
八、详细完整代码
# -*- coding: utf-8 -*-
import pandas as pd
import multiprocessing as mp
import time
from random import choice
def output(queue,i):
df = pd.DataFrame({}, columns=['id', 'desc'])
itimes=0
while True:
if queue.qsize() >= 1:
result=queue.get()
i=i+1
itimes=0
print("第%d个,%s,%s"%(i,result["id"],result["desc"]))
df.loc[result["id"]]=[result["id"],result["desc"]]
else:
if itimes>50000:
print("保存进程退出")
break
itimes = itimes + 1
df.to_csv("state.csv")
time.sleep(0.01)
def input(queue,queueresult):
itimes=0
while True:
if queue.qsize() >= 1:
itimes = 0
id=queue.get()
dowork(id,queueresult)
else:
if itimes>1000:
break
itimes = itimes + 1
time.sleep(0.01)
def dowork(id,queueresult):
#此处添加处理逻辑
return
def run_multi_proc():
ids = []
mp.set_start_method(method='spawn')
queues = []
queueresult = mp.Queue(maxsize=3000)
processes = []
for i in range(20):
queue = mp.Queue(maxsize=1000)
queues.append(queue)
processes.append(mp.Process(target=input, args=(queue,queueresult)))
i=0
processes.append(mp.Process(target=output, args=(queueresult,i)))
j=0
for id in ids:
q=choice(queues)
q.put(id)
j=j+1
print("写入队列个数:%d"%(j))
for process in processes:
process.daemon = True
process.start()
for process in processes:
process.join()
if __name__ == '__main__':
run_multi_proc()
pass
1、代码导入了pandas 库用于数据处理,multiprocessing 用于并行处理,time 用于时间相关操作,choice 从random 模块中导入用于随机选择一个队列。
2、run_multi_proc 函数是整个程序的入口函数。它初始化了一些变量,包括一个空的ids列表用于存储要处理的项目ID,创建了多个队列(queues),创建了一个用于存储处理结果的队列(queueresult),并创建了一组处理进程(processes)。
通过循环,它创建了指定数量的输入进程(input 函数的进程),每个进程都绑定到一个队列,并将它们添加到processes 列表中。然后,它创建了一个输出进程(output 函数的进程),将该进程绑定到queueresult 队列,并将其添加到processes 列表中。
接下来,通过循环将项目ID 放入随机选择的队列中,以便分配给相应的输入进程进行处理。在循环结束后,打印出被放入队列的项目数量。
然后,启动所有进程,并设置它们为守护进程。最后,使用join 方法等待所有进程结束。
3、dowork 函数代表要对从队列中获取的每个项目进行的实际处理工作。它接收一个id 和一个queueresult 参数,但目前没有包含任何特定的逻辑。
4、input 函数负责从队列中获取项目并将其传递给dowork 函数进行处理。它不断检查队列的大小,如果队列中有项目,它获取项目,调用dowork 函数并将项目作为参数传递,然后重置itimes 计数器。如果队列为空,则等待0.01秒并递增itimes 计数器。如果itimes 超过1000,循环中断,进程终止。
5、output 函数负责从队列中获取项目并进行处理。它创建一个Pandas DataFrame,并不断检查队列的大小。如果队列中有项目,它获取项目,增加计数器i的值,并打印相关信息。同时,它将信息添加到DataFrame 中。如果队列为空,则等待0.01秒,然后将DataFrame 保存为名为"state.csv" 的CSV文件。它使用变量itimes 跟踪队列为空的次数。如果itimes 超过50000,循环中断,进程终止。