以下是代码:
// 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个实例运行了几个小时的查询,当其中一个被启动时,我没有看到其他查询填充它们各自的输出文件。如何强制并行执行实例?
答案 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."