廖雪峰網站學習python遇到的一些問題彙總
阿新 • • 發佈:2018-11-20
問題1:在學習分散式程序的時候,遇到了一個問題,其官網的程式碼執行環境是在搭建在linux平臺下的,而相同的程式碼在windows下會產生不一樣的結果。
QueueManager.register('get_task_queue', callable=lambda: task_queue) QueueManager.register('get_result_queue', callable=lambda: result_queue)
因為linux下建立程序使用的是fork(),而windows平臺下建立程序使用是CreateProccess()。fork()呼叫之後,沒有寫操作之前,與父程序共享一份記憶體,並沒有真正擁有所謂多程序的“私有記憶體”。而CreateProccess()每次執行之後,都確保子程序擁有新的記憶體空間。這樣設計的原因可以從linux和windows多程序的應用場景的差別來理解:fork誕生於無執行緒時代,因此fork()之後不exec的話,作用與多執行緒非常相似,可以理解為沒有執行緒概念下的一種解決方案。而CreateProccess則更像建立兄弟程序,建立的程序都保證獨立存在。這種差別直接體現在multiprocessing模組當中,在不同平臺下使用不同的方法建立例子中的manager程序。在windows下通過將父程序的環境進行序列化儲存之後,再傳入createProccess當中。問題在於pickling序列化中對匿名函式的不支援,導致建立程序失敗。因此把匿名函式用函式替代即可解決。.
# 替代原來的匿名函式 def return_task_queue(): global task_queue return task_queue # 替代原來的匿名函式 def return_result_queue(): global result_queue return result_queue # callable引數指定函式 QueueManager.register('get_result_queue',callable=return_result_queue) # callable引數指定函式 QueueManager.register('get_result_queue',callable=return_result_queue)
同時,windows平臺下需要加入if name == main:判斷,防止迴圈import