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

Multiprocessing in Python creates single process

我在 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”和一组 class 停机时间的对象。在我的客户端主机中,我试图遍历我拥有的客户端数量并为每个客户端创建一个对象,从而为每个客户端创建一个进程。

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

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

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

Process()(类似于Thread())需要不带()的函数名称,以便稍后可以使用()在新进程中启动。

target=downtimeObj[x].live

如果你使用 with () 那么它会在当前进程中 运行s live() 并将它的结果作为参数发送给 Process() like

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()

编辑:

如果你需要发送参数然后使用元组即。 (value1, value2)

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

并将运行live(value1, value2)

对于单个参数,您还需要元组,即。 (value1,)
它需要 , inside ( ) 来创建单个元素的元组。

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)