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)
我在 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)