在Django模型中使用Python脚本的多进程

1 投票
1 回答
1530 浏览
提问于 2025-04-18 09:00

我正在写一个自定义脚本,目的是用 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

撰写回答