在Django模型中使用Python脚本的多进程
我正在写一个自定义脚本,目的是用 Django 模型来同时运行多个相同的函数。
这段代码主要包括:
if __name__ == '__main__':
for count, script in enumerate(scripts):
for counter in range(0, len(counters)):
p = Process(target=script, args=(counters[counter][count],))
p.start()
p.join()
循环部分执行得很正常,但我在 __name__ == '__main__'
这行代码上遇到了问题。我可以临时修改一下,让它在那行之前变成 __name__=__main__
,但这样做会导致 p.start()
报错,错误信息是:
PicklingError: Can't pickle <function nordstrom_script at 0x0000000003B2A208>: it's not found as __main__.nordstrom_script
我对 Python 和 Django 还比较陌生,也没有尝试过多进程,所以如果我的逻辑有问题,请多多包涵。
如果能帮我解决这个问题,我会非常感激。我知道 Django 和多进程不太兼容,问题出在我使用了:
>>>python manage.py shell
>>>execscript('scripts/script.py')
而不是
>>>python scripts/script.py
1 个回答
1
这个版本可以直接运行,对我来说没问题。你能修改一下这个代码,让它出现同样的错误吗?注意,它只处理了'counters'的第一个参数,我想这是故意这样设计的。
源代码
import multiprocessing
def produce(arg):
print 'arg:',arg
scripts = [produce]
counters = [ [3350000, 7000000] ]
if __name__ == '__main__':
for count, script in enumerate(scripts):
for counter in range(0, len(counters)):
p = multiprocessing.Process(
target=script, args=(counters[counter][count],)
)
p.start()
p.join()
输出结果
arg: 3350000