一、多进程包引用

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,循环中断,进程终止。