[python](windows)分布式进程问题:pickle模块不能序列化lambda函数
生活随笔
收集整理的這篇文章主要介紹了
[python](windows)分布式进程问题:pickle模块不能序列化lambda函数
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
運(yùn)行錯(cuò)誤:_pickle.PicklingError: Can't pickle <function <lambda> at 0x000002BAAEF12F28>: attribute lookup <lambda> on __main__ failed
代碼如下:
1 #!/usr/bin/env python3 2 # -*- coding: utf-8 -*- 3 4 import random, time, queue 5 from multiprocessing.managers import BaseManager 6 7 # 發(fā)送任務(wù)的隊(duì)列: 8 task_queue = queue.Queue() 9 # 接收結(jié)果的隊(duì)列: 10 result_queue = queue.Queue() 11 12 # 從BaseManager繼承的QueueManager: 13 class QueueManager(BaseManager): 14 pass 15 16 # 把兩個(gè)Queue都注冊(cè)到網(wǎng)絡(luò)上, callable參數(shù)關(guān)聯(lián)了Queue對(duì)象: 17 QueueManager.register('get_task_queue', callable=lambda: task_queue) 18 QueueManager.register('get_result_queue', callable=lambda: result_queue) 19 20 # 綁定端口5000, 設(shè)置驗(yàn)證碼'abc': 21 manager = QueueManager(address=('', 5000), authkey=b'abc') 22 23 # 啟動(dòng)Queue: 24 manager.start() 25 26 # 獲得通過(guò)網(wǎng)絡(luò)訪問(wèn)的Queue對(duì)象: 27 task = manager.get_task_queue() 28 result = manager.get_result_queue() 29 30 # 放幾個(gè)任務(wù)進(jìn)去: 31 for i in range(10): 32 n = random.randint(0, 10000) 33 print('Put task %d...' % n) 34 task.put(n) 35 36 # 從result隊(duì)列讀取結(jié)果: 37 print('Try get results...') 38 for i in range(10): 39 r = result.get(timeout=10) 40 print('Result: %s' % r) 41 42 # 關(guān)閉: 43 manager.shutdown() 44 print('master exit.')報(bào)錯(cuò)信息:
1 Traceback (most recent call last): 2 File "task_master.py", line 22, in <module> 3 manager.start() 4 File "E:\Anaconda\Anaconda3\lib\multiprocessing\managers.py", line 513, in start 5 self._process.start() 6 File "E:\Anaconda\Anaconda3\lib\multiprocessing\process.py", line 105, in start 7 self._popen = self._Popen(self) 8 File "E:\Anaconda\Anaconda3\lib\multiprocessing\context.py", line 322, in _Popen 9 return Popen(process_obj) 10 File "E:\Anaconda\Anaconda3\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__ 11 reduction.dump(process_obj, to_child) 12 File "E:\Anaconda\Anaconda3\lib\multiprocessing\reduction.py", line 60, in dump 13 ForkingPickler(file, protocol).dump(obj) 14 _pickle.PicklingError: Can't pickle <function <lambda> at 0x000002BAAEF12F28>: attribute lookup <lambda> on __main__ failed錯(cuò)誤原因:pickle模塊不能序列化lambda,需要自定義函數(shù)
修改代碼如下:
?
1 #!/usr/bin/env python3 2 # -*- coding: utf-8 -*- 3 4 import random, time, queue 5 from multiprocessing.managers import BaseManager 6 7 # 發(fā)送任務(wù)的隊(duì)列: 8 task_queue = queue.Queue() 9 # 接收結(jié)果的隊(duì)列: 10 result_queue = queue.Queue() 11 12 # 自定義函數(shù)re_task_queue 13 def re_task_queue(): 14 global task_queue 15 return task_queue 16 17 # 自定義函數(shù)re_result_queue 18 def re_result_queue(): 19 global result_queue 20 return result_queue 21 22 # 從BaseManager繼承的QueueManager: 23 class QueueManager(BaseManager): 24 pass 25 26 if __name__ == '__main__': 27 28 # 把兩個(gè)Queue都注冊(cè)到網(wǎng)絡(luò)上, callable參數(shù)關(guān)聯(lián)了Queue對(duì)象: 29 QueueManager.register('get_task_queue', callable=re_task_queue) 30 QueueManager.register('get_result_queue', callable=re_result_queue) 31 32 # 綁定端口5000, 設(shè)置驗(yàn)證碼'abc': 33 manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc') 34 35 # 啟動(dòng)Queue: 36 manager.start() 37 38 # 獲得通過(guò)網(wǎng)絡(luò)訪問(wèn)的Queue對(duì)象: 39 task = manager.get_task_queue() 40 result = manager.get_result_queue() 41 42 # 放幾個(gè)任務(wù)進(jìn)去: 43 for i in range(10): 44 n = random.randint(0, 10000) 45 print('Put task %d...' % n) 46 task.put(n) 47 48 # 從result隊(duì)列讀取結(jié)果: 49 print('Try get results...') 50 for i in range(10): 51 r = result.get(timeout=10) 52 print('Result: %s' % r) 53 54 # 關(guān)閉: 55 manager.shutdown() 56 print('master exit.')?
運(yùn)行結(jié)果:
C:\Users\Lucky丶M\python>python task_master.py Put task 4962... Put task 3460... Put task 4774... Put task 4301... Put task 9120... Put task 7183... Put task 4915... Put task 3173... Put task 9138... Put task 5798... Try get results...?
轉(zhuǎn)載于:https://www.cnblogs.com/ttkl/p/8692335.html
總結(jié)
以上是生活随笔為你收集整理的[python](windows)分布式进程问题:pickle模块不能序列化lambda函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。