python初学分布式疑问,请pythoner帮忙看看,谢谢!

玩味Orz 软件工程师  2014-08-24 10:22:53
最近通过廖雪峰的官网开始学习python

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832973658c780d8bfa4c6406f83b2b3097aed5df6000

python环境为2.7.8
学到分布式进程这一节运行服务端代码出现错误
PicklingError: Can't pickle <function <lambda> at 0x02747DB0>: it's not found as __main__.<lambda>

具体代码如下,大家也可以点击那个链接去查看

# -*- coding: utf-8 -*-
# taskmanager.py

import random, time, Queue
from multiprocessing.managers import BaseManager

# 发送任务的队列:
task_queue = Queue.Queue()
# 接收结果的队列:
result_queue = Queue.Queue()

# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
pass

# 把两个Queue都注册到网络上, callable参数关联了Queue对象:
QueueManager.register('get_task_queue', Queue.Queue())
QueueManager.register('get_result_queue', lambda: Queue.Queue())
# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('', 5000), authkey='abc')
# 启动Queue:
manager.start()
# 获得通过网络访问的Queue对象:
task = manager.get_task_queue()
result = manager.get_result_queue()
# 放几个任务进去:
for i in range(10):
n = random.randint(0, 10000)
print('Put task %d...' % n)
task.put(n)
# 从result队列读取结果:
print('Try get results...')
for i in range(10):
r = result.get(timeout=10)
print('Result: %s' % r)
# 关闭:
manager.shutdown()


全部错误信息如下

Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>

Traceback (most recent call last):
File "C:/Users/wangwei/Desktop/test", line 22, in <module>
manager.start()
File "C:\Python27\lib\multiprocessing\managers.py", line 524, in start
self._process.start()
File "C:\Python27\lib\multiprocessing\process.py", line 130, in start
self._popen = Popen(self)
File "C:\Python27\lib\multiprocessing\forking.py", line 277, in __init__
dump(process_obj, to_child, HIGHEST_PROTOCOL)
File "C:\Python27\lib\multiprocessing\forking.py", line 199, in dump
ForkingPickler(file, protocol).dump(obj)
File "C:\Python27\lib\pickle.py", line 224, in dump
self.save(obj)
File "C:\Python27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Python27\lib\pickle.py", line 419, in save_reduce
save(state)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Python27\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.py", line 562, in save_tuple
save(element)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Python27\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.py", line 562, in save_tuple
save(element)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.py", line 748, in save_global
(obj, module, name))
PicklingError: Can't pickle <function <lambda> at 0x02747DB0>: it's not found as __main__.<lambda>
>>>


该代码在ubuntu python2.6.x上运行正常

请各位老手帮忙看下,谢谢!
...全文
5796 1 收藏 31
写回复
31 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
蜗牛东南飞 2017-05-01
Traceback (most recent call last):
  File "task_mater.py", line 19, in <module>
    manager.start()
  File "C:\Program Files\Python35\lib\multiprocessing\managers.py", line 479, in start
    self._process.start()
  File "C:\Program Files\Python35\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\Program Files\Python35\lib\multiprocessing\context.py", line 313, in _Popen
    return Popen(process_obj)
  File "C:\Program Files\Python35\lib\multiprocessing\popen_spawn_win32.py", line 66, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Program Files\Python35\lib\multiprocessing\reduction.py", line 59, in dump
    ForkingPickler(file, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function <lambda> at 0x00000000006490D0>: attribute lookup <lambda> on __main__ failed
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Program Files\Python35\lib\multiprocessing\spawn.py", line 100, in spawn_main
    new_handle = steal_handle(parent_pid, pipe_handle)
  File "C:\Program Files\Python35\lib\multiprocessing\reduction.py", line 86, in steal_handle
    _winapi.DUPLICATE_SAME_ACCESS | _winapi.DUPLICATE_CLOSE_SOURCE)
PermissionError: [WinError 5] Access is denied
同样是从廖老师的教程中找到这儿来的,表示这个错误也可以用这种方法解决。电脑是win7 64位,python 3.5
回复
a_i_smith 2016-08-02
很有帮助啊,至少程序运行成功了,正在搞懂原理
回复
zhtengsh 2016-07-24
引用 24 楼 adfaksdf 的回复:
[quote=引用 23 楼 amingZhang 的回复:] 找到楼主最初问题的解决方法了,贴在这里,方便后人: 廖老师给出的示例代码在Mac OS X下运行良好 但是在Windows 7环境task_master.py会出现问题 需要修改三个地方 第一: 以下两句register内不要使用lambda

QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)
改成以下方法:

def return_task_queue():
    global task_queue
    return task_queue

def return_result_queue():
    global result_queue
    return result_queue

QueueManager.register('get_task_queue', callable=return_task_queue)
QueueManager.register('get_result_queue', callable=return_result_queue)
第二: 创建manager时加上IP地址。

# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')
第三: 整个代码用 if __name__ == '__main__':语句包起来, 并在一开始增加freeze_support()调用 最后附上完整的task_master.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random, time, queue
from multiprocessing import freeze_support
from multiprocessing.managers import BaseManager

# 发送任务的队列:
task_queue = queue.Queue()
# 接收结果的队列:
result_queue = queue.Queue()

# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
    pass

def return_task_queue():
    global task_queue
    return task_queue

def return_result_queue():
    global result_queue
    return result_queue

def test():
    # 把两个Queue都注册到网络上, callable参数关联了Queue对象:
    # QueueManager.register('get_task_queue', callable=lambda: task_queue)
    # QueueManager.register('get_result_queue', callable=lambda: result_queue)
    QueueManager.register('get_task_queue', callable=return_task_queue)
    QueueManager.register('get_result_queue', callable=return_result_queue)

    # 绑定端口5000, 设置验证码'abc':
    manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')
    # 启动Queue:
    manager.start()
    # 获得通过网络访问的Queue对象:
    task = manager.get_task_queue()
    result = manager.get_result_queue()
    # 放几个任务进去:
    for i in range(10):
        n = random.randint(0, 10000)
        print('Put task %d...' % n)
        task.put(n)
    # 从result队列读取结果:
    print('Try get results...')
    for i in range(10):
        r = result.get(timeout=10)
        print('Result: %s' % r)
    # 关闭:
    manager.shutdown()
    print('master exit.')

if __name__ == '__main__':
    freeze_support()
    test()
感谢层主的答案,我根据你的代码把程序调通了。 单有几个疑问: 我的版本是python3.4, from multiprocessing import freeze_support 这句不成功,最后也没用freeze_support函数, 程序能运行,请问这是为什么呢?[/quote] 查了下freeze_support函数,如果你的机器是win32,Run code for process object if this in not the main process
回复
next_ 2016-06-19
这个必须顶一下、我也遇到这个问题。
回复
phoenxior 2016-05-23
我按你这样改了,但是还是报错,系统win7 64位,python3.4.4

引用 23 楼 amingZhang 的回复:
找到楼主最初问题的解决方法了,贴在这里,方便后人:

廖老师给出的示例代码在Mac OS X下运行良好
但是在Windows 7环境task_master.py会出现问题
需要修改三个地方

第一:
以下两句register内不要使用lambda

QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)


改成以下方法:

def return_task_queue():
global task_queue
return task_queue

def return_result_queue():
global result_queue
return result_queue

QueueManager.register('get_task_queue', callable=return_task_queue)
QueueManager.register('get_result_queue', callable=return_result_queue)


第二:
创建manager时加上IP地址。

# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')


第三:
整个代码用 if __name__ == '__main__':语句包起来,
并在一开始增加freeze_support()调用

最后附上完整的task_master.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random, time, queue
from multiprocessing import freeze_support
from multiprocessing.managers import BaseManager

# 发送任务的队列:
task_queue = queue.Queue()
# 接收结果的队列:
result_queue = queue.Queue()

# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
pass

def return_task_queue():
global task_queue
return task_queue

def return_result_queue():
global result_queue
return result_queue

def test():
# 把两个Queue都注册到网络上, callable参数关联了Queue对象:
# QueueManager.register('get_task_queue', callable=lambda: task_queue)
# QueueManager.register('get_result_queue', callable=lambda: result_queue)
QueueManager.register('get_task_queue', callable=return_task_queue)
QueueManager.register('get_result_queue', callable=return_result_queue)

# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')
# 启动Queue:
manager.start()
# 获得通过网络访问的Queue对象:
task = manager.get_task_queue()
result = manager.get_result_queue()
# 放几个任务进去:
for i in range(10):
n = random.randint(0, 10000)
print('Put task %d...' % n)
task.put(n)
# 从result队列读取结果:
print('Try get results...')
for i in range(10):
r = result.get(timeout=10)
print('Result: %s' % r)
# 关闭:
manager.shutdown()
print('master exit.')

if __name__ == '__main__':
freeze_support()
test()
回复
phoenxior 2016-05-23
麻烦解释下freeze_support是什么,有什么作用?
引用 23 楼 amingZhang 的回复:
找到楼主最初问题的解决方法了,贴在这里,方便后人: 廖老师给出的示例代码在Mac OS X下运行良好 但是在Windows 7环境task_master.py会出现问题 需要修改三个地方 第一: 以下两句register内不要使用lambda

QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)
改成以下方法:

def return_task_queue():
    global task_queue
    return task_queue

def return_result_queue():
    global result_queue
    return result_queue

QueueManager.register('get_task_queue', callable=return_task_queue)
QueueManager.register('get_result_queue', callable=return_result_queue)
第二: 创建manager时加上IP地址。

# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')
第三: 整个代码用 if __name__ == '__main__':语句包起来, 并在一开始增加freeze_support()调用 最后附上完整的task_master.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random, time, queue
from multiprocessing import freeze_support
from multiprocessing.managers import BaseManager

# 发送任务的队列:
task_queue = queue.Queue()
# 接收结果的队列:
result_queue = queue.Queue()

# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
    pass

def return_task_queue():
    global task_queue
    return task_queue

def return_result_queue():
    global result_queue
    return result_queue

def test():
    # 把两个Queue都注册到网络上, callable参数关联了Queue对象:
    # QueueManager.register('get_task_queue', callable=lambda: task_queue)
    # QueueManager.register('get_result_queue', callable=lambda: result_queue)
    QueueManager.register('get_task_queue', callable=return_task_queue)
    QueueManager.register('get_result_queue', callable=return_result_queue)

    # 绑定端口5000, 设置验证码'abc':
    manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')
    # 启动Queue:
    manager.start()
    # 获得通过网络访问的Queue对象:
    task = manager.get_task_queue()
    result = manager.get_result_queue()
    # 放几个任务进去:
    for i in range(10):
        n = random.randint(0, 10000)
        print('Put task %d...' % n)
        task.put(n)
    # 从result队列读取结果:
    print('Try get results...')
    for i in range(10):
        r = result.get(timeout=10)
        print('Result: %s' % r)
    # 关闭:
    manager.shutdown()
    print('master exit.')

if __name__ == '__main__':
    freeze_support()
    test()
回复
adfaksdf 2015-08-19
引用 23 楼 amingZhang 的回复:
找到楼主最初问题的解决方法了,贴在这里,方便后人: 廖老师给出的示例代码在Mac OS X下运行良好 但是在Windows 7环境task_master.py会出现问题 需要修改三个地方 第一: 以下两句register内不要使用lambda

QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)
改成以下方法:

def return_task_queue():
    global task_queue
    return task_queue

def return_result_queue():
    global result_queue
    return result_queue

QueueManager.register('get_task_queue', callable=return_task_queue)
QueueManager.register('get_result_queue', callable=return_result_queue)
第二: 创建manager时加上IP地址。

# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')
第三: 整个代码用 if __name__ == '__main__':语句包起来, 并在一开始增加freeze_support()调用 最后附上完整的task_master.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random, time, queue
from multiprocessing import freeze_support
from multiprocessing.managers import BaseManager

# 发送任务的队列:
task_queue = queue.Queue()
# 接收结果的队列:
result_queue = queue.Queue()

# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
    pass

def return_task_queue():
    global task_queue
    return task_queue

def return_result_queue():
    global result_queue
    return result_queue

def test():
    # 把两个Queue都注册到网络上, callable参数关联了Queue对象:
    # QueueManager.register('get_task_queue', callable=lambda: task_queue)
    # QueueManager.register('get_result_queue', callable=lambda: result_queue)
    QueueManager.register('get_task_queue', callable=return_task_queue)
    QueueManager.register('get_result_queue', callable=return_result_queue)

    # 绑定端口5000, 设置验证码'abc':
    manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')
    # 启动Queue:
    manager.start()
    # 获得通过网络访问的Queue对象:
    task = manager.get_task_queue()
    result = manager.get_result_queue()
    # 放几个任务进去:
    for i in range(10):
        n = random.randint(0, 10000)
        print('Put task %d...' % n)
        task.put(n)
    # 从result队列读取结果:
    print('Try get results...')
    for i in range(10):
        r = result.get(timeout=10)
        print('Result: %s' % r)
    # 关闭:
    manager.shutdown()
    print('master exit.')

if __name__ == '__main__':
    freeze_support()
    test()
感谢层主的答案,我根据你的代码把程序调通了。 单有几个疑问: 我的版本是python3.4, from multiprocessing import freeze_support 这句不成功,最后也没用freeze_support函数, 程序能运行,请问这是为什么呢?
回复
amingZhang 2015-07-08
找到楼主最初问题的解决方法了,贴在这里,方便后人: 廖老师给出的示例代码在Mac OS X下运行良好 但是在Windows 7环境task_master.py会出现问题 需要修改三个地方 第一: 以下两句register内不要使用lambda

QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)
改成以下方法:

def return_task_queue():
    global task_queue
    return task_queue

def return_result_queue():
    global result_queue
    return result_queue

QueueManager.register('get_task_queue', callable=return_task_queue)
QueueManager.register('get_result_queue', callable=return_result_queue)
第二: 创建manager时加上IP地址。

# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')
第三: 整个代码用 if __name__ == '__main__':语句包起来, 并在一开始增加freeze_support()调用 最后附上完整的task_master.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random, time, queue
from multiprocessing import freeze_support
from multiprocessing.managers import BaseManager

# 发送任务的队列:
task_queue = queue.Queue()
# 接收结果的队列:
result_queue = queue.Queue()

# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
    pass

def return_task_queue():
    global task_queue
    return task_queue

def return_result_queue():
    global result_queue
    return result_queue

def test():
    # 把两个Queue都注册到网络上, callable参数关联了Queue对象:
    # QueueManager.register('get_task_queue', callable=lambda: task_queue)
    # QueueManager.register('get_result_queue', callable=lambda: result_queue)
    QueueManager.register('get_task_queue', callable=return_task_queue)
    QueueManager.register('get_result_queue', callable=return_result_queue)

    # 绑定端口5000, 设置验证码'abc':
    manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')
    # 启动Queue:
    manager.start()
    # 获得通过网络访问的Queue对象:
    task = manager.get_task_queue()
    result = manager.get_result_queue()
    # 放几个任务进去:
    for i in range(10):
        n = random.randint(0, 10000)
        print('Put task %d...' % n)
        task.put(n)
    # 从result队列读取结果:
    print('Try get results...')
    for i in range(10):
        r = result.get(timeout=10)
        print('Result: %s' % r)
    # 关闭:
    manager.shutdown()
    print('master exit.')

if __name__ == '__main__':
    freeze_support()
    test()
回复
amingZhang 2015-07-08
引用 21 楼 gliu12 的回复:
[quote=引用 18 楼 openXMPP 的回复:] 把你的代码粘贴复制 又运行 没出现你说的问题
我也在学习python 遇到同样的问题,就搜到了这里;但是我把他上面的两段代码复制下来运行报错,我装的是win7 64w位;python3.4的;代码是这样的
# basemanager.py

import random, time, queue, pickle
from multiprocessing.managers import BaseManager

# 发送任务队列
task_queue = queue.Queue();

# 从BaseManager继承QueueManager
class QueueManager(BaseManager):
    pass
	
# 将两个队列注册到网络上,callable参数关联Queue对象
QueueManager.register('get_task_queue',  callable=lambda: task_queue)
# 绑定端口5000, 设置验证码'abc'
manager = QueueManager(address=('127.0.0.1', 50000), authkey=b'abc')
# 启动Queue
s = manager.get_server()
s.serve_forever()

#basework.py

import random, time, queue
from multiprocessing.managers import BaseManager

class QueueManager(BaseManager):
	pass
	
QueueManager.register('get_task_queue')

#print('Connect to server %s ...' % server_addr)
m = BaseManager(address=('127.0.0.1', 5000), authkey=b'abc')
m.connect()

# 获得通过网络访问的Queue对象
task = m.get_task_queue()
# 加入任务
task.put('hello')
报的错误是这样的 Traceback (most recent call last): File "D:\MyProgram\python\basework.py", line 13, in <module> m.connect() File "D:\Mydevelop\Python34\lib\multiprocessing\managers.py", line 467, in connect conn = Client(self._address, authkey=self._authkey) File "D:\Mydevelop\Python34\lib\multiprocessing\connection.py", line 495, in Client c = SocketClient(address) File "D:\Mydevelop\Python34\lib\multiprocessing\connection.py", line 624, in SocketClient s.connect(address) ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。[/quote] 哥们,你的端口号写错了,一个50000,一个5000,怎么连接?
回复
gliu12 2015-04-09
引用 18 楼 openXMPP 的回复:
把你的代码粘贴复制 又运行 没出现你说的问题
我也在学习python 遇到同样的问题,就搜到了这里;但是我把他上面的两段代码复制下来运行报错,我装的是win7 64w位;python3.4的;代码是这样的
# basemanager.py

import random, time, queue, pickle
from multiprocessing.managers import BaseManager

# 发送任务队列
task_queue = queue.Queue();

# 从BaseManager继承QueueManager
class QueueManager(BaseManager):
    pass
	
# 将两个队列注册到网络上,callable参数关联Queue对象
QueueManager.register('get_task_queue',  callable=lambda: task_queue)
# 绑定端口5000, 设置验证码'abc'
manager = QueueManager(address=('127.0.0.1', 50000), authkey=b'abc')
# 启动Queue
s = manager.get_server()
s.serve_forever()

#basework.py

import random, time, queue
from multiprocessing.managers import BaseManager

class QueueManager(BaseManager):
	pass
	
QueueManager.register('get_task_queue')

#print('Connect to server %s ...' % server_addr)
m = BaseManager(address=('127.0.0.1', 5000), authkey=b'abc')
m.connect()

# 获得通过网络访问的Queue对象
task = m.get_task_queue()
# 加入任务
task.put('hello')
报的错误是这样的 Traceback (most recent call last): File "D:\MyProgram\python\basework.py", line 13, in <module> m.connect() File "D:\Mydevelop\Python34\lib\multiprocessing\managers.py", line 467, in connect conn = Client(self._address, authkey=self._authkey) File "D:\Mydevelop\Python34\lib\multiprocessing\connection.py", line 495, in Client c = SocketClient(address) File "D:\Mydevelop\Python34\lib\multiprocessing\connection.py", line 624, in SocketClient s.connect(address) ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
回复
mcfer 2015-03-12
你好,你的问题解决了吗?我的运行没有反应。
回复
玩味Orz 2014-08-27
引用 15 楼 openXMPP 的回复:
'foo.bar.org', 50000 你本机有这个Domain吗 换句话说 你ping这个'foo.bar.org' 地址 能到本机?
代码如下

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# task.py

import random, time, Queue
from multiprocessing.managers import BaseManager

class QueueManager(BaseManager):
	pass
	
QueueManager.register('get_task_queue')

server_addr = '10.135.90.95'
print('Connect to server %s ...' % server_addr)

m = QueueManager(address=(server_addr, 50000), authkey='abc')
m.connect()

# 获得通过网络访问的Queue对象
task = m.get_task_queue()
# 加入任务
task.put('hello')

# taskmanager.py

import random, time, Queue, pickle
from multiprocessing.managers import BaseManager

# 发送任务队列
task_queue = Queue.Queue();

# 从BaseManager继承QueueManager
class QueueManager(BaseManager):
    pass
	
# 将两个队列注册到网络上,callable参数关联Queue对象
QueueManager.register('get_task_queue',  callable=lambda: task_queue)
# 绑定端口5000, 设置验证码'abc'
manager = QueueManager(address=('', 50000), authkey='abc')
# 启动Queue
s = manager.get_server()
s.serve_forever()
回复
玩味Orz 2014-08-27
引用 15 楼 openXMPP 的回复:
'foo.bar.org', 50000 你本机有这个Domain吗 换句话说 你ping这个'foo.bar.org' 地址 能到本机?
这个Domain我已改成本机IP地址了 上面的代码是直接复制官网教程的,没有改过来,不好意思
回复
乔巴好萌 2014-08-27
'foo.bar.org', 50000 你本机有这个Domain吗 换句话说 你ping这个'foo.bar.org' 地址 能到本机?
回复
玩味Orz 2014-08-27
引用 13 楼 openXMPP 的回复:
这个是python内置的library 为什么不看官网的教程呢 https://docs.python.org/2/library/multiprocessing.html?highlight=basemanager#multiprocessing.managers.BaseManager.start
非常感谢,对着官网上的教程实验可以成功,但原方法在linux上也是可以行得通的 官网教程在实验过程中发现一个问题

from multiprocessing.managers import BaseManager
import Queue
queue = Queue.Queue()
lass QueueManager(BaseManager): pass
QueueManager.register('get_queue', callable=lambda:queue)
m = QueueManager(address=('', 50000), authkey='abracadabra')
s = m.get_server()
s.serve_forever()

from multiprocessing.managers import BaseManager
class QueueManager(BaseManager): pass
QueueManager.register('get_queue')
m = QueueManager(address=('foo.bar.org', 50000), authkey='abracadabra')
m.connect()
queue = m.get_queue()
queue.put('hello')
这两段代码如果在同一台机器上运行会发生 下面这个错误

Traceback (most recent call last):
  File "D:/Python/task.py", line 20, in <module>
    m.connect()
  File "C:\Python27\lib\multiprocessing\managers.py", line 500, in connect
    conn = Client(self._address, authkey=self._authkey)
  File "C:\Python27\lib\multiprocessing\connection.py", line 175, in Client
    answer_challenge(c, authkey)
  File "C:\Python27\lib\multiprocessing\connection.py", line 428, in answer_challenge
    message = connection.recv_bytes(256)         # reject large message
EOFError
初学这个,请见谅,再次感谢!
回复
乔巴好萌 2014-08-27
这个是python内置的library 为什么不看官网的教程呢 https://docs.python.org/2/library/multiprocessing.html?highlight=basemanager#multiprocessing.managers.BaseManager.start
回复
玩味Orz 2014-08-27
引用 11 楼 xydtf 的回复:
像是pickle dump时不完整造成的,可能是多线程问题,put任务时加个锁试试
我把下面那一段全去了 只保留到 [code=python ]# 绑定端口5000, 设置验证码'abc': manager = QueueManager(address=('', 5000), authkey='abc') # 启动Queue: manager.start() [/code] 还是出现同样的错误 真郁闷

Traceback (most recent call last):
  File "D:\Python\taskmanager.py", line 37, in <module>
    manager.start()
  File "C:\Python27\lib\multiprocessing\managers.py", line 528, in start
    self._address = reader.recv()
EOFError
今天学习解析XML 导包的时候竟然都出发问题了

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
sys.path.append('C:\\Python27\\Lib\\xml\\parsers\\expat.py')
print sys.path
from xml.parsers.expat import ParserCreate
错误如下:

Traceback (most recent call last):
  File "D:\Python\xml.py", line 6, in <module>
    from xml.parsers.expat import ParserCreate
  File "D:\Python\xml.py", line 6, in <module>
    from xml.parsers.expat import ParserCreate
ImportError: No module named parsers.expat
不知道为什么。。。。。 太郁闷了
回复
玩味Orz 2014-08-27
引用 18 楼 openXMPP 的回复:
把你的代码粘贴复制 又运行 没出现你说的问题
找到原因了 我用Python IDLE运行的,两个代码都在一个shell里运行时发生了这个错误 开多个shell 时 运行正常,再次感谢!
回复
乔巴好萌 2014-08-27
把你的代码粘贴复制 又运行 没出现你说的问题
回复
玩味Orz 2014-08-26
引用 9 楼 xydtf 的回复:
[quote=引用 8 楼 xydtf 的回复:] 打错了 print dir(module) 改为 print dir(mod),mod.__file__
加在mod = sys.modules[module] 这行之后[/quote] 非常感谢你的耐心解答,根据你的方法修改后,现在没有出现找不到属性错误 但还是在manager.start()时出现了另外一个错误,如下:

Traceback (most recent call last):
  File "D:\Python\taskmanager.py", line 37, in <module>
    manager.start()
  File "C:\Python27\lib\multiprocessing\managers.py", line 528, in start
    self._address = reader.recv()
EOFError
这个是不是还是在做pickle时发生的问题呢?
回复
加载更多回复
相关推荐
发帖
脚本语言
创建于2007-08-27

3.7w+

社区成员

JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
申请成为版主
帖子事件
创建了帖子
2014-08-24 10:22
社区公告

CSDN 脚本语言社区接受专栏投稿(专栏会在顶部创建专属你的栏目),投稿需满足以下要求:

  • 脚本语言技术相关;
  • 文章持续更新,保持活跃;
  • 内容清晰明了,干货为主;
  • 文章排版有序,有条有理。

本社区开通招聘专栏,发布招聘信息请联系版主,发布者需要保证招聘信息真实有效,CSDN 平台和版主不对招聘内容负责!

联系方式:私聊版主、发送邮件、QQ联系等均可: