Python中的多进程创建单个进程

2024-09-28 13:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python中的多处理有一个问题,请参阅下面的代码:

processArray = []
downtimeObj = []
for x in range(0,len(clientMaster)):
    downtimeObj.append(Downtime(clientMaster[x]))
    processArray.append(multiprocessing.Process(target=downtimeObj[x].live(),))
    for j in range(len(processArray)):
        processArray[j].start()
    for z in range(len(processArray)):
        processArray[z].join()

这里我有一个进程数组“processArray”和一个类对象数组。在我的客户机主机中,我试图遍历我拥有的客户机数量,并为每个客户机创建一个对象,从而为每个客户机创建一个进程

当前代码创建单个进程并按时间顺序运行live()函数

我希望所有客户端都有单独的进程,并且object.live()函数同时运行


Tags: 对象函数代码inlivefor客户机len
1条回答
网友
1楼 · 发布于 2024-09-28 13:28:14

您应该更改缩进和只创建所有进程的首次运行循环。运行.start()的下一个循环。最后是使用.join()的循环

而且Process()(类似于Thread())需要函数名,而不需要(),所以以后它可以使用()在新进程中启动

target=downtimeObj[x].live

如果与()一起使用,则它在当前进程中运行live(),并将其结果作为Process()的参数发送

result = downtimeObj[x].live()
Process(target=result)

您还可以学习在不使用range(len())的情况下使用for-loop,这样会更具可读性

processArray = []
downtimeObj = []

#  - loop  -

for item in clientMaster:
    obj = Downtime(item)
    downtimeObj.append(obj)
    p = multiprocessing.Process(target=obj.live)
    processArray.append(p)

#  - after loop  -

for p in processArray:
    p.start()

for p in processesArray:
    p.join()

或者您至少应该.join()在第一个循环之外运行

processArray = []
downtimeObj = []

#  - loop  -

for item in clientMaster:
    obj = Downtime(item)
    downtimeObj.append(obj)
    p = multiprocessing.Process(target=obj.live)
    processArray.append(p)
    p.start()

#  - after loop  -

for p in processesArray:
    p.join()

编辑:

如果需要发送参数,请使用元组ie.(value1, value2)

Process(target=obj.live, args=(value1, value2))

并将运行live(value1, value2)

对于单参数,还需要元组ie.(value1,)
它需要,内部( )来创建具有单个元素的元组

Process(target=obj.live, args=(value1,))

并将运行live(value1)

您也可以在文档Process中看到它


编辑:

如果您想使用Pool始终只运行5个进程并获得所有结果

from multiprocessing import Pool

#  - function for Process  -

def my_function(item, arg1, arg2):
    obj = Downtime(item)
    return obj.live(arg1, arg2)

#  - create arguments for all processes  -

arguments = []

for item in clientMaster:
    arguments.append( (item, value1, value2) )

#  - use Pool and wait for all results  -

with Pool(5) as p:
     results = p.starmap(my_function, arguments)

#  - display all results  -

print(results)

相关问题 更多 >

    热门问题