使用对象列表创建不同的流程

时间:2019-03-07 09:01:53

标签: python python-3.x list loops parallel-processing

我想执行此功能而不必重写每个进程的所有代码。

def executeNode(node):
    node.execution()

我认为不需要重复下一个代码n次的代码。我需要使用“进程而不是线程”。

a0 = Process(target=executeNode, args = (node1))
a1 = Process(target=executeNode, args = (node2))
a2 = Process(target=executeNode, args = (node3))
...............................
an = Process(target=executeNode, args = (nodeN))

因此,我决定创建一个节点列表,但是我不知道如何为列表的每个项目(节点)执行一个过程。

sNodes = []

for i in range(0, n):
    node = node("a"+ str(i), (4001 + i))
    sNodes.append(node)

如何为列表(sNodes)的每个项目(节点)执行一个过程。 谢谢大家。

2 个答案:

答案 0 :(得分:3)

您可以使用Pool

from multiprocessing import Pool

if __name__ == '__main__':
    with Pool(n) as p:
        print(p.map(executeNode, sNodes))

n是您想要的进程数。

如果您想要分离进程,或者您不希望通过使用另一个循环来获得更好的结果:

processes = []
for node in sNodes:
    p = Process(target=executeNode, args = (node1))
    processes.append(p)
    p.Start()

一般性提示:具有很多的进程不会加快代码的速度,但会使处理器开始交换,并且一切都会变慢。万一您在寻找代码加速而不是逻辑体系结构的话。

答案 1 :(得分:0)

尝试这样的事情:

from multiprocessing import Pool

process_number = 4
nodes = [...]

def execute_node(node):
    print(node)

pool = Pool(processes=process_number)
pool.starmap(execute_node, [(node,) for node in nodes])
pool.close()

您将在这里找到更多的英特尔信息:https://docs.python.org/3/library/multiprocessing.html