1. 程式人生 > >廖雪峰網站學習python遇到的一些問題匯總

廖雪峰網站學習python遇到的一些問題匯總

urn spa imp 原因 main 例子 import 存在 ces

問題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

廖雪峰網站學習python遇到的一些問題匯總