Python池spawining池
我有一个函数,它使用Python池spawining池,python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,我有一个函数,它使用多处理.Pool并行处理one数据集中的所有数据 from multiprocessing import Pool ... def func(): ... p = Pool(processes=N) p.map(func, params) ... 但是,我现在希望对M不同的数据集并行运行此操作。因此,我在上面现有脚本的基础上编写了另一个脚本。我再次尝试使用Pool创建M进程(每个进程都会产生Pool的N进程)。然而,我得到了一个关于守护进程无
多处理.Pool
并行处理one数据集中的所有数据
from multiprocessing import Pool
...
def func():
...
p = Pool(processes=N)
p.map(func, params)
...
但是,我现在希望对M
不同的数据集并行运行此操作。因此,我在上面现有脚本的基础上编写了另一个脚本。我再次尝试使用Pool
创建M
进程(每个进程都会产生Pool
的N
进程)。然而,我得到了一个关于守护进程无法生成子进程的错误(听起来非常摇滚)。因此,我做了一些阅读,并将Pool
切换到不太熟悉的multiprocessing.Pool.ThreadPool
。看来
p = ThreadPool(processes=M)
p.starmap(func, args)
然而,当我运行这个程序时,我看到
ThreadPool
一次只处理一个数据集。那么,我应该使用什么来创建一个脚本,该脚本生成M
子脚本,每个子脚本生成N
子脚本,并并行执行所有操作。只需写出外部池,然后使用进程即可。由于GIL,线程在Python中的表现非常糟糕
from multiprocessing import Pool
...
def func():
...
p = Pool(processes=N)
p.map(func, params)
...
这实际上没有什么作用,但给出了一个想法:
from multiprocessing import Pool, Process
from time import sleep
from random import randint
list = [1,2,3,4,5,6,7]
def worker(a):
print a
sleep(randint(0,2))
def f1(a):
_p = Pool(processes=7)
_p.map(worker, list)
_p.close()
_p.join()
def f2():
processes = []
for _i in list:
p = Process(target=f1, args=(_i,))
p.start()
processes.append(p)
for _q in processes:
q.join()
f2()
它将启动七个进程,每个进程依次启动一个池,f2等待所有进程完成 下面是使用
Manager.Queue()
的示例。(不是我在评论中写的监视器,我的坏消息)。这真的是一个非常简单的程序,如果你去掉所有的键盘中断异常处理,试图让它很好地关闭,但它仍然没有做到。现在您有了一个外部的进程池,这些进程又产生了一个执行任务的池。队列用于将任务提供给外部池工作人员,而外部池工作人员又将任务提供给工作人员。他们在无限循环中等待着队列中的东西
当然,如果您希望管理外部池工作人员并告诉他们做不同的事情,您也可以在那里添加控制消息(例如,如果外部池工作人员收到“exit”一词,它将关闭其池并很好地退出)
from multiprocessing import Pool, Process
from time import sleep
from random import randint
from multiprocessing import Manager
import sys
alist = [1, 2, 3, 4, 5, 6, 7]
def worker(a):
try:
print a
sleep(randint(0, 2))
except KeyboardInterrupt:
pass
def outer_pool(iq, n):
_ip = Pool(processes=7)
try:
while True:
y = iq.get()
_param = []
for _ny in alist:
_param.append("%d - %d - %d" % (n, _ny, y))
_ip.map(worker, _param)
except KeyboardInterrupt:
try:
_ip.terminate()
except:
pass
c_queue = Manager().Queue()
o_processes = []
for t in alist:
p = Process(target=outer_pool, args=(c_queue, t))
p.start()
o_processes.append(p)
try:
while True:
a = randint(42,100)
c_queue.put(a)
except KeyboardInterrupt:
for _p in o_processes:
try:
_p.terminate()
except:
pass
sys.exit(0)
我现在真的很沮丧,因为我尝试这是我的第一次尝试,但遇到了问题,我的内部池只产卵1工人。我已经按照您的计划实施了,它运行得非常完美。谢谢不确定我以前做得有什么不正确。如果您还需要外部事物的“池”行为,您当然可以创建进程并使用
Monitor.Queue()
与它们通信,然后将任务提供给它们处理。这可能只是增加了复杂性,但是如果您的外循环进程需要在完成正在处理的任务后立即运行另一个任务,那么这是可行的。这听起来更像是我需要的。我可以麻烦您举个例子吗?当然,但必须等到明天。明天早上我会尽量记住的。