Python 多处理进程 ID
Python multiprocessing Process ID
我也在使用 multiprocessing.Pool 运行 不同的进程(例如 4 个进程),我需要对每个进程进行标识,以便我可以在每个进程中做不同的事情。
因为我在 while 循环中有池 运行ning,对于第一次迭代,我可以知道每个进程的 ID,但是对于第二次和更多迭代,这个 ID 会改变,或者至少我可以'找不到一个 属性 似乎对所有迭代中的每个过程都相同。
相关部分代码如下:
while i <= maxiter:
print('\n' + 'Iteration: %r'%i + '\n')
pool = mp.Pool(processes = numprocs)
swarm = pool.map_async(partial(proxy, costf = costFunc, i=i),Swarm)
pool.close()
pool.join()
Swarm = swarm.get()
我已经尝试使用以下属性来正确标识进程,但它对我不起作用:
print(mp.Process().name)
print(mp.current_process().name)
有了这个输出是:
Iteration: 1
Process-2:1
Process-1:1
ForkPoolWorker-1
ForkPoolWorker-2
Process-3:1
ForkPoolWorker-3
Process-2:2
ForkPoolWorker-2
Process-3:2
Process-2:3
ForkPoolWorker-3
ForkPoolWorker-2
Process-1:2
ForkPoolWorker-1
Process-4:1
Process-3:3
ForkPoolWorker-4
ForkPoolWorker-3
Process-2:4
ForkPoolWorker-2
Iteration: 2
Process-5:1
ForkPoolWorker-5
Process-5:2
Process-7:1
ForkPoolWorker-7
Process-6:1
ForkPoolWorker-5
ForkPoolWorker-6
Process-5:3
ForkPoolWorker-5
Process-7:2
ForkPoolWorker-7
Process-5:4
ForkPoolWorker-5
Process-6:2
ForkPoolWorker-6
Process-7:3
ForkPoolWorker-7
Process-8:1
ForkPoolWorker-8
有什么想法可以让我每次都以相同的方式识别每个进程吗?
编辑 1:
我已经将程序简化为这样,但思路是一样的:
import random, numpy as np,time
import multiprocessing as mp
def costFunc(i):
print(mp.current_process().name,mp.Process().name)
return i*1
class PSO():
def __init__(self,maxiter,numprocs):
# Begin optimization Loop
i = 1
self.Evol = []
while i <= maxiter:
print('\n' + 'Iteration: %r'%i + '\n')
pool = mp.Pool(processes = numprocs)
swarm = pool.map_async(costFunc,(i,))
pool.close()
pool.join()
Swarm = swarm.get()
i += 1
if __name__ == "__main__":
#mp.set_start_method('spawn')
PSO(10,1)
输出:
Iteration: 1
ForkPoolWorker-1 Process-1:1
Iteration: 2
ForkPoolWorker-2 Process-2:1
Iteration: 3
ForkPoolWorker-3 Process-3:1
Iteration: 4
ForkPoolWorker-4 Process-4:1
Iteration: 5
ForkPoolWorker-5 Process-5:1
Iteration: 6
ForkPoolWorker-6 Process-6:1
Iteration: 7
ForkPoolWorker-7 Process-7:1
Iteration: 8
ForkPoolWorker-8 Process-8:1
Iteration: 9
ForkPoolWorker-9 Process-9:1
Iteration: 10
ForkPoolWorker-10 Process-10:1
您将在循环的每次迭代中创建一个新池,因此永远不会重复使用池中的进程。
将 pool = mp.Pool(processes = numprocs)
(以及 pool.close()
和 pool.join()
)移出 while 循环以重新使用池中的进程。
我也在使用 multiprocessing.Pool 运行 不同的进程(例如 4 个进程),我需要对每个进程进行标识,以便我可以在每个进程中做不同的事情。
因为我在 while 循环中有池 运行ning,对于第一次迭代,我可以知道每个进程的 ID,但是对于第二次和更多迭代,这个 ID 会改变,或者至少我可以'找不到一个 属性 似乎对所有迭代中的每个过程都相同。
相关部分代码如下:
while i <= maxiter:
print('\n' + 'Iteration: %r'%i + '\n')
pool = mp.Pool(processes = numprocs)
swarm = pool.map_async(partial(proxy, costf = costFunc, i=i),Swarm)
pool.close()
pool.join()
Swarm = swarm.get()
我已经尝试使用以下属性来正确标识进程,但它对我不起作用:
print(mp.Process().name)
print(mp.current_process().name)
有了这个输出是:
Iteration: 1
Process-2:1
Process-1:1
ForkPoolWorker-1
ForkPoolWorker-2
Process-3:1
ForkPoolWorker-3
Process-2:2
ForkPoolWorker-2
Process-3:2
Process-2:3
ForkPoolWorker-3
ForkPoolWorker-2
Process-1:2
ForkPoolWorker-1
Process-4:1
Process-3:3
ForkPoolWorker-4
ForkPoolWorker-3
Process-2:4
ForkPoolWorker-2
Iteration: 2
Process-5:1
ForkPoolWorker-5
Process-5:2
Process-7:1
ForkPoolWorker-7
Process-6:1
ForkPoolWorker-5
ForkPoolWorker-6
Process-5:3
ForkPoolWorker-5
Process-7:2
ForkPoolWorker-7
Process-5:4
ForkPoolWorker-5
Process-6:2
ForkPoolWorker-6
Process-7:3
ForkPoolWorker-7
Process-8:1
ForkPoolWorker-8
有什么想法可以让我每次都以相同的方式识别每个进程吗?
编辑 1:
我已经将程序简化为这样,但思路是一样的:
import random, numpy as np,time
import multiprocessing as mp
def costFunc(i):
print(mp.current_process().name,mp.Process().name)
return i*1
class PSO():
def __init__(self,maxiter,numprocs):
# Begin optimization Loop
i = 1
self.Evol = []
while i <= maxiter:
print('\n' + 'Iteration: %r'%i + '\n')
pool = mp.Pool(processes = numprocs)
swarm = pool.map_async(costFunc,(i,))
pool.close()
pool.join()
Swarm = swarm.get()
i += 1
if __name__ == "__main__":
#mp.set_start_method('spawn')
PSO(10,1)
输出:
Iteration: 1
ForkPoolWorker-1 Process-1:1
Iteration: 2
ForkPoolWorker-2 Process-2:1
Iteration: 3
ForkPoolWorker-3 Process-3:1
Iteration: 4
ForkPoolWorker-4 Process-4:1
Iteration: 5
ForkPoolWorker-5 Process-5:1
Iteration: 6
ForkPoolWorker-6 Process-6:1
Iteration: 7
ForkPoolWorker-7 Process-7:1
Iteration: 8
ForkPoolWorker-8 Process-8:1
Iteration: 9
ForkPoolWorker-9 Process-9:1
Iteration: 10
ForkPoolWorker-10 Process-10:1
您将在循环的每次迭代中创建一个新池,因此永远不会重复使用池中的进程。
将 pool = mp.Pool(processes = numprocs)
(以及 pool.close()
和 pool.join()
)移出 while 循环以重新使用池中的进程。