Python多处理

FFr*_*son 5 python multicore multiprocessing

这个问题更多的是事实发现和思考过程而不是面向代码.

我有许多编译的C++程序,我需要在不同的时间和不同的参数运行.我正在寻找使用Python多处理从作业队列(rabbitmq)读取作业,然后将该作业提供给C++程序来运行(可能是子进程).我正在查看多处理模块,因为这将在双Xeon服务器上运行,所以我想充分利用我的服务器的多处理器能力.

Python程序将是中央管理器,只是从队列中读取作业,使用适当的C++程序生成进程(或子进程?)来运行作业,获取结果(subprocess stdout&stderr),将其提供给回调并将进程放回进程队列中,等待下一个作业运行.

首先,这听起来像一个有效的策略吗?

第二,是否有任何类似的例子?

先感谢您.

unu*_*tbu 10

Python程序将是中央管理器,只需从que中读取作业,使用适当的C++程序生成进程(或子进程?)来运行作业,获取结果(subprocess stdout&stderr),将其提供给回调并将进程放回等待下一个作业运行的进程中.

你不需要这个multiprocessing模块.该multiprocessing模块适合将Python函数作为单独的进程运行.要运行C++程序并从stdout读取结果,您只需要该subprocess模块.队列可以是一个列表,并且您的Python程序将在列表非空时循环.


但是,如果你愿意的话

  1. 产生多个工作进程
  2. 让他们从一个公共队列中读取
  3. 使用队列中的参数来生成C++程序(并行)
  4. 使用C++程序的输出将新项目放入队列中

然后你可以这样做multiprocessing:

test.py:

import multiprocessing as mp
import subprocess
import shlex

def worker(q):
    while True:
        # Get an argument from the queue
        x=q.get()

        # You might change this to run your C++ program
        proc=subprocess.Popen(
            shlex.split('test2.py {x}'.format(x=x)),stdout=subprocess.PIPE)
        out,err=proc.communicate()

        print('{name}: using argument {x} outputs {o}'.format(
            x=x,name=mp.current_process().name,o=out))

        q.task_done()

        # Put a new argument into the queue
        q.put(int(out))

def main():
    q=mp.JoinableQueue()

    # Put some initial values into the queue
    for t in range(1,3):
        q.put(t)

    # Create and start a pool of worker processes
    for i in range(3):
        p=mp.Process(target=worker, args=(q,))
        p.daemon=True
        p.start()
    q.join()
    print "Finished!"

if __name__=='__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

test2.py(简单替代你的C++程序):

import time
import sys

x=int(sys.argv[1])
time.sleep(0.5)
print(x+3)
Run Code Online (Sandbox Code Playgroud)

运行test.py可能会产生这样的事情:

Process-1: using argument 1 outputs 4
Process-3: using argument 3 outputs 6
Process-2: using argument 2 outputs 5
Process-3: using argument 6 outputs 9
Process-1: using argument 4 outputs 7
Process-2: using argument 5 outputs 8
Process-3: using argument 9 outputs 12
Process-1: using argument 7 outputs 10
Process-2: using argument 8 outputs 11
Process-1: using argument 10 outputs 13
Run Code Online (Sandbox Code Playgroud)

请注意,右侧列中的数字被反馈到队列中,并且(最终)用作参数,test2.py并在左硬列中显示为数字.