Python:using 进程池中的多进程管理器
Python:using multiprocessing manager in process pool
我使用 multiprocessing.managers.BaseManager 在服务器端管理一个队列,我尝试在另一个使用进程池的 python 脚本中使用这个队列,但我总是收到如下错误消息,这个python脚本的主要代码也如下,它将以运行()方法开始。
File "/usr/lib/python2.7/multiprocessing/connection.py", line 435, in answer_challenge
raise AuthenticationError('digest sent was rejected')
AuthenticationError: (AuthenticationError('digest sent was rejected',), <function RebuildProxy at 0x7ff8de0b8320>, (<function AutoProxy at 0x7ff8de0b7938>, Token(typeid='Queue', address=('localhost', 12345), id='7f4624039cd0'), 'pickle', {'exposed': ('cancel_join_thread', 'close', 'empty', 'full', 'get', 'get_nowait', 'join_thread', 'put', 'put_nowait', 'qsize')}))
def __init__(self, spider_count=cpu_count()):
self._spider_count = spider_count
mgr = MyManager(address=('localhost', 12345), authkey='xxxxx')
server = mgr.connect()
self._queue = mgr.Queue()
def run(self):
pool = Pool(self._spider_count)
while not self._queue.empty():
#add some control on q.get() if queue is empty
pool.apply_async(self.startCrawl, (self._queue.get(),))
pool.close()
pool.join()
但是当我在单线程中使用它时,它运行良好,当使用池时,出现此错误消息。
这听起来像是 http://bugs.python.org/issue7503
中描述的问题
In practice all processes using the manager should have current_process().authkey
set to the same value.
然后,解决方法是在 __init__
:
中赋值
multiprocessing.current_process().authkey = 'xxxxx'
我使用 multiprocessing.managers.BaseManager 在服务器端管理一个队列,我尝试在另一个使用进程池的 python 脚本中使用这个队列,但我总是收到如下错误消息,这个python脚本的主要代码也如下,它将以运行()方法开始。
File "/usr/lib/python2.7/multiprocessing/connection.py", line 435, in answer_challenge
raise AuthenticationError('digest sent was rejected')
AuthenticationError: (AuthenticationError('digest sent was rejected',), <function RebuildProxy at 0x7ff8de0b8320>, (<function AutoProxy at 0x7ff8de0b7938>, Token(typeid='Queue', address=('localhost', 12345), id='7f4624039cd0'), 'pickle', {'exposed': ('cancel_join_thread', 'close', 'empty', 'full', 'get', 'get_nowait', 'join_thread', 'put', 'put_nowait', 'qsize')}))
def __init__(self, spider_count=cpu_count()):
self._spider_count = spider_count
mgr = MyManager(address=('localhost', 12345), authkey='xxxxx')
server = mgr.connect()
self._queue = mgr.Queue()
def run(self):
pool = Pool(self._spider_count)
while not self._queue.empty():
#add some control on q.get() if queue is empty
pool.apply_async(self.startCrawl, (self._queue.get(),))
pool.close()
pool.join()
但是当我在单线程中使用它时,它运行良好,当使用池时,出现此错误消息。
这听起来像是 http://bugs.python.org/issue7503
中描述的问题In practice all processes using the manager should have
current_process().authkey
set to the same value.
然后,解决方法是在 __init__
:
multiprocessing.current_process().authkey = 'xxxxx'