TypeError: can't pickle _thread.lock objects 分布式進程學習 中出現的錯誤
QueueManager.register('get_task_queue', callable=get_task()) 原因是這里的callable的參數賦值方法加了() 去掉就行了
# coding:utf-8
# WINDOWS
import queue
from multiprocessing.managers import BaseManager
from multiprocessing import freeze_support
# 任務個數
task_number = 10
# 定義收發隊列
task_queue = queue.Queue(task_number)
result_queue = queue.Queue(task_number)
# 創建類似的queuemanager
class QueueManager(BaseManager):
pass
def get_task():
global task_queue
return task_queue
def get_result():
global result_queue
return result_queue
def win_run():
# 先定義函數在綁定
QueueManager.register('get_task_queue', callable=get_task())
QueueManager.register('get_result_queue', callable=get_result())
manager = QueueManager(address=('127.0.0.1', 8001), authkey=b'qiye')
# 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', 8001), authkey=b'qiye')
# 啟動
manager.start()
# 通過網絡獲取任務隊列和結果隊列
task = manager.get_task_queue()
result = manager.get_result_queue()
try:
# 添加任務
for url in ['ImgUrl_'+str(i) for i in range(10)]:
print('put task %s...' % url)
task.put(url)
print('try to get result')
for i in range(10):
print('result is %s' % result.get(timeout=10))
except queue.Empty:
print('result is empty')
finally:
#關閉
manager.shutdown()
if __name__ == '__main__':
# windows多進程可能有問題 加以下代碼緩解
freeze_support()
win_run()
