Python 2.6 Win32 (xp) 的多进程

2 投票
1 回答
2578 浏览
提问于 2025-04-15 11:31

我试着从Jesse Noller的多进程讲座中复制这个例子(这是在另一个StackOverflow帖子中推荐的)[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'

这个函数虽然很简单,但我还是搞不懂为什么会出问题。

我只是为了自学基本概念,并不是想提前优化什么实际问题。

谢谢。

1 个回答

4

从错误信息来看,你似乎是在直接把代码输入到Python解释器里(也就是REPL)。

不要这样做。把代码保存到一个文件里,然后通过文件来运行,使用这个命令:

python myfile.py

这样做就能解决你的问题。


另外,有一行代码是错的:

print 'Sleeping for ' + wait + ' seconds'

应该改成:

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

因为你不能把字符串和整数直接拼接在一起(Python是强类型的语言)。

撰写回答