Python多处理工作程序/队列

Python多处理工作程序/队列,python,multiprocessing,Python,Multiprocessing,我有一个python函数,它总共要运行12次。目前,我已经设置了这个程序,使用多处理库中的池并行运行到所有这些程序。通常我一次运行6个,因为函数是CPU密集型的,并行运行12个常常会导致程序崩溃。当我们一次做6个时,第二组6个将不会开始,直到前6个过程全部完成。理想情况下,我们希望在第一批6中的一个完成后,立即启动另一个(如第7批),以便在有更多开始的情况下,立即运行6个。现在代码看起来是这样的(它将被调用两次,在一个列表中传递前6个元素,然后在另一个列表中传递第二个6个元素: from mul

我有一个python函数,它总共要运行12次。目前,我已经设置了这个程序,使用多处理库中的池并行运行到所有这些程序。通常我一次运行6个,因为函数是CPU密集型的,并行运行12个常常会导致程序崩溃。当我们一次做6个时,第二组6个将不会开始,直到前6个过程全部完成。理想情况下,我们希望在第一批6中的一个完成后,立即启动另一个(如第7批),以便在有更多开始的情况下,立即运行6个。现在代码看起来是这样的(它将被调用两次,在一个列表中传递前6个元素,然后在另一个列表中传递第二个6个元素:

from multiprocessing import Pool

def start_pool(project_list):

    pool = Pool(processes=6)
    pool.map(run_assignments_parallel,project_list[0:6])
因此,我一直在尝试实现一个worker/queue解决方案,但遇到了一些问题。我有一个worker函数,如下所示:

def worker(work_queue, done_queue):
    try:
        for proj in iter(work_queue.get, 'STOP'):
            print proj
            run_assignments_parallel(proj)
            done_queue.put('finished ' + proj )
    except Exception, e:        
        done_queue.put("%s failed on %s with: %s" % (current_process().name, proj,        e.message))
    return True
调用worker函数的代码如下:

workers = 6
work_queue = Queue()
done_queue = Queue()  
processes = []
for project in project_list:
    print project
    work_queue.put(project)
for w in xrange(workers):        
    p = Process(target=worker, args=(work_queue, done_queue))
    p.start()
    processes.append(p)
    work_queue.put('STOP')
for p in processes:
     p.join()    
     done_queue.put('STOP')
for status in iter(done_queue.get, 'STOP'):        
    print status
project_list只是需要在函数“run_assignments_parallel”中运行的12个项目的路径列表

现在的编写方式是,同一个进程(项目)的函数被调用了不止一次,我真的不知道发生了什么。这段代码基于我找到的一个示例,我非常确定循环结构是混乱的。任何帮助都会很好,我为我对这件事的无知道歉。谢谢

理想情况下,我们希望在第一批6中的一个完成后,立即启动另一个(如第7批),以便在有更多开始的情况下,立即运行6个

您需要更改的是传递所有12个输入参数,而不是6个:

from multiprocessing import Pool
pool = Pool(processes=6) # run no more than 6 at a time
pool.map(run_assignments_parallel, project_list) # pass full list (12 items)
您可以使用该模块

创建一个6人、单阶段的管道,并将所有项目作为任务输入。然后只需在结束时读取结果(在您的情况下,状态)

from mpipe import Pipeline, OrderedStage

...    

pipe = Pipeline(OrderedStage(run_assignments_parallel), 6)    

for project in project_list:
   pipe.put(project)

pipe.put(None)  # Signal end of input.

for status in pipe.results():
   print(status)

好的,你的索引会出现错误,请检查它allpxl修复了明显的格式,但是考虑到所有其他行都是正确的-put('SOP')不符合Python文档示例谢谢!这确实是正确的,我以前尝试过,现在我(再次)意识到了这一点为什么我的问题稍微复杂一点-该函数使用来自某些专有软件的API,调用无法销毁和重新创建的对象。换句话说,每个项目都必须在单独的进程上运行,这就是为什么第二组6会再次调用start_pool函数的原因。有什么想法吗?@user2503169:a)检查对象是否已创建,例如。,如果它不是
None
b)或者您希望为每个任务创建一个新进程,请将其设置为全局,不要尝试重新创建它:c)创建12个
进程
,并使用
信号灯
,以避免超过6次运行。看起来MaxTaskPercild是一个简单的解决方案,但我正在运行2.6(因为有专有软件)。你能告诉我怎样使用信号灯吗?我真的很感谢你的帮助@user2503169:使用值
6
在主进程中创建
Semaphore
。将它传递给两个所有子进程(12),用sem包装您的代码
:…您的子代码在这里..
。每次使用sem语句在
中输入处理时,都会自动调用
sem.acquire()
,使信号量值递减。如果它达到零,则
sem.acquire()
阻塞,直到调用
sem.release()
(使用sem:
退出时自动执行)。例如,查看如何(您的案例更简单)如下:'maxconnections=6 sem=BoundedSemaphore(value=maxconnections)和sem:pool=pool(processs=12)pool.map(run\u assignments\u parallel,project\u list)'