【发布时间】:2014-01-13 12:39:40
【问题描述】:
我有一个“令人尴尬的并行”任务:我正在尝试以 CPU 繁重的方式解析大量日志文件。我不关心它们完成的顺序,进程不需要共享任何资源或线程。
我在 Windows 机器上。
我的设置是这样的:
main.py
import parse_file
import multiprocessing
...
files_list = ['c:\file1.log','c:\file2.log']
if __name__ == '__main__':
pool = multiprocessing.Pool(None)
for this_file in files_list:
r = pool.apply_async(parse_file.parse, (this_file, parser_config))
results = r.get()
...
#Code to do stuff with the results
parse_file 基本上是一个完全独立的模块,不访问任何共享资源 - 结果以列表形式返回。
当我在没有多处理的情况下运行它时,这一切都运行得很好,但是当我启用它时,会发生一堵巨大的错误墙,表明源模块(其中的那个)是正在运行的模块并行运行。 (该错误是仅在源脚本(不是 parse_file 模块)中的数据库锁定错误,并且在多处理之前的某个点!)
我并没有假装理解多处理模块,而是从 other 示例 here 开始工作,但没有一个包含任何表明这是正常的或为什么会发生的内容。
我做错了什么?如何多处理此任务? 谢谢!
使用此方法可轻松复制: 测试.py
import multiprocessing
import test_victim
files_list = ['c:\file1.log','c:\file2.log']
print("Hello World")
if __name__ == '__main__':
pool = multiprocessing.Pool(None)
results = []
for this_file in files_list:
r = pool.map_async(test_victim.calculate, range(10), callback=results.append)
results = r.get()
print(results)
test_victim.py:
def calculate(value):
return value * 10
运行 test.py 时的输出应该是:
Hello World
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
但实际上是这样的:
Hello World
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
Hello World
Hello World
(额外的“Hello World”的实际数量)每次我运行它时都会在 1 到 4 之间变化 = 应该没有)
【问题讨论】:
-
确保
for-loop缩进,以便在if __name__ ...语句内。否则代码将在 Windows 上导入炸弹。 -
@unutbu - 谢谢。根据您的建议,我刚刚这样做了,但恐怕这完全没有区别。 :-((更新示例以反映这一点))
-
请发布堆栈跟踪,至少前几行和最后几行。
-
在堆栈跟踪中,以
File开头的最后一行是指脚本的路径(main.py)是什么?后面的线是什么? -
我不知道问题出在哪里,但在我看来,我们需要了解您使用 sqlite3 的结构。重现错误的可运行示例将非常棒。
标签: python python-3.x multiprocessing