Python 2.6 Win32 (xp) 上的 Python 多处理

Posted

技术标签:

【中文标题】Python 2.6 Win32 (xp) 上的 Python 多处理【英文标题】:Python multiprocessing on Python 2.6 Win32 (xp) 【发布时间】:2010-10-25 10:12:50 【问题描述】:

我试图从 jesse noller 的 Multiprocessing 讲座中复制这个示例(如另一篇 SO 帖子中所推荐的那样)[http://pycon.blip.tv/file/1947354?filename=Pycon-IntroductionToMultiprocessingInPython630.mp4]

但由于某种原因,我收到了一个错误,好像它忽略了我的函数定义: 我在 Windows XP (win32) 我知道 2.6 中的多处理库有限制,要求一切都可以腌制

from multiprocessing import Process
import time

def sleeper(wait):
    print 'Sleeping for %d seconds' % (wait,)
    time.sleep(wait)
    print 'Sleeping complete'

def doIT():    
    p = Process(target=sleeper, args=(9,))
    p.start()
    time.sleep(5)
    p.join()

if __name__ == '__main__':
    doIT()

输出:

Evaluating mypikklez.py
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python26\lib\multiprocessing\forking.py", line 342, in main
    self = load(from_parent)
  File "C:\Python26\lib\pickle.py", line 1370, in load
    return Unpickler(file).load()
  File "C:\Python26\lib\pickle.py", line 858, in load
    dispatch[key](self)
  File "C:\Python26\lib\pickle.py", line 1090, in load_global
    klass = self.find_class(module, name)
  File "C:\Python26\lib\pickle.py", line 1126, in find_class
    klass = getattr(mod, name)
AttributeError: 'module' object has no attribute 'sleeper'

导致问题的错误是:AttributeError: 'module' object has no attribute 'sleeper'

这么简单的功能,我不明白会有什么问题。

这只是为了基本概念的自学目的。我不想预先优化任何现实世界的问题。

谢谢。

【问题讨论】:

当你解决你的主要问题时,你不能做“p = Process(target=sleeper, args=(9,)).start()”,因为 start() 方法返回无。您需要执行“p = Process(target=sleeper, args=(9,))”,然后执行“p.start()”。否则你对“p.join()”的调用将失败,因为 p 是 None。 【参考方案1】:

从追溯看来,您正在将代码直接运行到 python 解释器 (REPL) 中。

不要那样做。将代码保存在文件中,然后使用以下命令从文件中运行它:

python myfile.py

这将解决您的问题。


作为一个无关的注释,这行是错误的:

print 'Sleeping for ' + wait + ' seconds'

应该是:

print 'Sleeping for %d seconds' % (wait,)

因为你不能连接 string 和 int 对象(python 是强类型的)

【讨论】:

您的修复是绝对正确的,并且 100% pythonic(更不用说可扩展/可读/可扩展,但我经常想知道这种形式是否效率低于: print "Sleeping for ", a, " seconds ” 甚至“睡了” + str(a) + “ 秒” @unknown:从项目文件夹中删除您创建的 pickle.py 文件和相应的 .pyc。 @Shane:谁在乎它是否慢了 0.0002 毫秒?甚至不应该考虑这么小的性能差异。 @nosklo - 你能告诉我为什么从命令运行它(使用你的修复程序)可以工作,但是让 WingIDE 在解释器中“评估”我的文件会出现问题吗?我喜欢每隔几行运行一次代码(因为我还在学习)来检查错误——将来以这种方式不必要地启动它似乎很麻烦?什么可以在 REPL(?) 中运行而不在 REPL 中运行? @unknown: 因为其他进程必须导入您的文件才能在其中运行函数。如果不保存,其他进程就无法导入。

以上是关于Python 2.6 Win32 (xp) 上的 Python 多处理的主要内容,如果未能解决你的问题,请参考以下文章

使用深度完美的XP32位安装mysql5.2.6时总提示错误,但是更换成微软或者雨林木风的XP32位就能装上

Visual Studio 2010 win32 编译的应用程序在 windows xp 上不起作用

Nehalem Xeon 在 32 位操作系统、XP 与 2003 上的性能对比

如何在同一个 Windows XP 机器上同时运行 python 2.6 和 3.0?

Visual Studio 2012 为 XP 编译 - 无效 win32 - v110_xp

Winpcap 和 DeviceIoControl - Win7 上的错误代码 1