2017-01-17 48 views
0

我寫了下面的代碼:程序與Python,但得到了一個錯誤_pickle.PicklingError

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

task_queue = queue.Queue() 
result_queue = queue.Queue() 

class QueueManager(BaseManager): 
    pass 

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

manager = QueueManager(address=('', 5000), authkey=b'abd') 

manager.start() 

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) 

print('Try get result...') 
for i in range(10): 
    r = result.get(timeout=10) 
    print('Result: %s' % r) 

manager.shutdown() 
print('master exit.') 

但它運行的時候,我收到此錯誤:

Traceback (most recent call last): 
    File "D:/PycharmProjects/test/task_master.py", line 23, in <module> 
    manager.start() 
    File "C:\Users\tang_ke\AppData\Local\Programs\Python\Python35-32\lib\multiprocessing\managers.py", line 479, in start 
    self._process.start() 
    File "C:\Users\tang_ke\AppData\Local\Programs\Python\Python35-32\lib\multiprocessing\process.py", line 105, in start 
    self._popen = self._Popen(self) 
    File "C:\Users\tang_ke\AppData\Local\Programs\Python\Python35-32\lib\multiprocessing\context.py", line 313, in _Popen 
    return Popen(process_obj) 
    File "C:\Users\tang_ke\AppData\Local\Programs\Python\Python35-32\lib\multiprocessing\popen_spawn_win32.py", line 66, in __init__ 
    reduction.dump(process_obj, to_child) 
    File "C:\Users\tang_ke\AppData\Local\Programs\Python\Python35-32\lib\multiprocessing\reduction.py", line 59, in dump 
    ForkingPickler(file, protocol).dump(obj) 
_pickle.PicklingError: Can't pickle <function <lambda> at 0x03A67C48>: attribute lookup <lambda> on __main__ failed 

Process finished with exit code 1 
+0

請使用提供的編輯工具來格式化您的代碼。確切地說明你想要代碼做什麼,它做什麼,以及你嘗試過什麼。你有沒有做過任何調試? – jdv

+0

歡迎來到Stackoverflow!爲了充分利用網站,提出一些好問題很重要。有關提問的指南,請訪問:http://stackoverflow.com/help/how-to-ask –

+0

結果和任務的隊列沒有任何連接。如果我運行你的代碼,result.get()會導致超時。酸洗錯誤似乎很奇怪,我不能重現它。 – lhk

回答

1

我在現場得到答案:討論 - 廖雪峯的官方網站

第1步: 不要使用 「拉姆達」,在 「QueueManager.register」,你必須更換功能,例如:

def return_task_queue(): 
    global task_queue 
    return task_queue 

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

第2步: 你有當您創建「的QueueManager」添加ip地址,例如:

QueueManager(address=('127.0.0.1', 5000), authkey=b'abc') 

第3步: 你必須把所有的功能有關的QueueManager和任務,並導致功能...例如:

def test(): 
    QueueManager.register('get_task_queue', callable=return_task_queue) 
    QueueManager.register('get_result_queue', callable=return_result_queue) 
    manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc') 
    manager.start() 
    .... 

,你必須使用在主函數,例如功能 「測試」:

if __name__ == '__main__': 
    test() 
相關問題