Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Python-多个进程连续运行_Python 2.7_Parallel Processing - Fatal编程技术网

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
的每个实例都链接到一个数据库表,并将其关联的输出文件放在磁盘上,因此它们不会在表之间重叠。