Python 2.7 Python-多个进程连续运行
代码如下:Python 2.7 Python-多个进程连续运行,python-2.7,parallel-processing,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_extra
// 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 post:,引用了公认的答案“您要么想在for循环之外单独加入您的进程(例如,将它们存储在一个列表中,然后对其进行迭代),要么使用类似numpy.Pool的东西,并通过回调应用_async”。尽管我也这样做了,但我的所有进程都是按顺序运行的。我之所以知道这一点,是因为其中4个实例的查询运行了几个小时,当其中一个实例启动时,我看不到其他查询填充各自的输出文件。如何强制并行执行实例?我猜在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."
所有进程是否都从同一个数据库读取和写入数据?可能问题在于,您的进程通过查询间接地相互阻塞。它们都从同一个数据库读取数据,但写入特定的文件。i、 e.
DatabaseExtractor
的每个实例都链接到一个数据库表,并将其关联的输出文件放在磁盘上,因此它们不会在表之间重叠。