Python3.4多处理

时间:2015-07-18 12:09:34

标签: python-3.x multiprocessing

我正在尝试运行multiprocessing pool来访问多个网址并同时使用特定功能提取数据。不幸的是,我一直在eachticker中获得ticker_list的重复输出。我想要eachTicker

的单行输出

ticker_list = []

with open('/home/a73nk-xce/Documents/Python/SharkFin/SP500_Fin/SP_StockChar/ticker.csv', 'r', newline='') as csvfile:
    spamreader = csv.reader(csvfile)
    for rows in spamreader:
        pass

    for eachTicker in rows:
        ticker_list.append(eachTicker)

if __name__ == '__main__':
    pool = mp.Pool(20)
    pool.map(IncData, ticker_list)
    pool.terminate()

输出

[28105000, 16863000, 11242000, 0, 8355000, 87000, 0, 0, 2800000, -15000, 2785000, 395000, 2390000, 864000, 0, 1509000, 0, 0, 0, 0, 1526000, 0, 1526000]
[1262006, 829648, 432358, 0, 252384, 0, 0, 0, 179974, -2082, 177892, 11392, 166500, 45959, 0, 120541, -2171, 0, 0, 0, 118370, 0, 118370]
[6981000, 3388000, 3593000, 719000, 2043000, 0, 0, 0, 831000, -72000, 759000, 113000, 646000, 142000, 0, 504000, 0, 0, 0, 0, 504000, 0, 504000]
[6981000, 3388000, 3593000, 719000, 2043000, 0, 0, 0, 831000, -72000, 759000, 113000, 646000, 142000, 0, 504000, 0, 0, 0, 0, 504000, 0, 504000]
[69269000, 0, 69269000, 0, 55852000, 20058000, 6666000, 0, 13794000, 570000, 28054000, 13690000, 14364000, 686400

正如您所看到的那样,输出ablove为重复项,并在运行整个程序时执行此操作

1 个答案:

答案 0 :(得分:0)

由于提供的信息不完整,我不确定我是否正确理解了问题。

如果IncData正在将结果写入单个文件,则问题是由于工作进程对该文件的并发访问。如果文件由多个进程同时写入,则写入将重叠,从而导致文件损坏。这可能是你所说的"重复行"。

的原因

最好的方法是让IncData callable将结果输出返回给父进程,而不是将自己写在文件上。然后,父进程将聚合来自worker的结果,并按顺序将它们写在文件上。

类似的东西:

if __name__ == '__main__':
    with mp.Pool(20) as pool:
        results_list = pool.map(IncData, ticker_list)

    with open('/path/to/your/file.csv', 'w') as csvfile:
        csvfile.writelines(results_list)