Python - 运行顺序的多个进程

时间:2015-08-27 15:43:08

标签: python-2.7 parallel-processing

以下是代码:

// database_extractor.py
class DatabaseExtractor(object):

    def __init__(self, ..):

        ...

    def run_extraction(self):

        // run sql query to extract data to a file


//driver.py

def extract__func(db_extractor):

    db_extractor.run_extraction()


if __name__ == "__main__":

    db1 = DatabaseExtractor(..)
    db2 = DatabaseExtractor(..)
    db3 = DatabaseExtractor(..)
    db4 = DatabaseExtractor(..)
    db5 = DatabaseExtractor(..)
    db6 = DatabaseExtractor(..)
    db7 = DatabaseExtractor(..)
    db8 = DatabaseExtractor(..)

    worker_l = [Process(extract_func, args=[db1]), 
                Process(extract_func, args=[db2]),
                Process(extract_func, args=[db3]),
                Process(extract_func, args=[db4]),
                Process(extract_func, args=[db5]),
                Process(extract_func, args=[db6]),
                Process(extract_func, args=[db7]),
                Process(extract_func, args=[db8])]

    for worker in worker_l: worker.start()

    for worker in worker_l: worker.join()

(实际上,DatabaseExtractor的实例是基于输入配置文件生成的,因此可能有超过8个进程在运行)

我提到了SO帖子:Reference,引用了接受的答案“你要么想要在你的for循环之外单独加入你的进程(例如,将它们存储在一个列表中,然后迭代它)或使用类似numpy.Pool和apply_async的回调“。即使我做了同样的事情,我的所有进程都按顺序运行。我知道这个的原因是因为有4个实例运行了几个小时的查询,当其中一个被启动时,我没有看到其他查询填充它们各自的输出文件。如何强制并行执行实例?

1 个答案:

答案 0 :(得分:0)

我的猜测是在DB层发生了一些事情。此示例显示就进程而言,所有内容都按预期工作。我建议检查数据库锁定等。

from multiprocessing import Process
from random import randint
from time import sleep

def wait_proc(i, s):
   print "%d - Working for %d seconds" % (i,s)
   sleep(s)
   print "%d - Done." % (i,)

wait_l = [Process(target=wait_proc, args=[i,randint(5,15)]) for i in range(10)]

for w in wait_l:
   w.start()

for w in wait_l:
   w.join()

print "All done."