學習python多線程和多進程的一點感想
多線程方面倒沒啥可說的,很簡單。值得注意的是,多線程并不限制你一次只執行一個,如果你的線程之間不共享變量的話,是用不到線程鎖的,雖然這么說,但是其實即使不用lock程序還是一次只執行一個線程。如果程序內部有阻塞現象(比如下載之類),使用線程很不錯,但是如果沒有的話,用不用線程的消耗差別不大(甚至因為要支持線程而減慢)。不使用lock其實是將lock交給了python負責,它會根據阻塞與否協調線程的執行。
說回重點,多進程吧。
下面是我從其他人的帖子里抄來的一個多進程示范腳本(當然修改了一些):
import multiprocessing import os def get(url,lock): lock.acquire() print os.getpid(),url lock.release() plist=[] lock=multiprocessing.Lock() for i in ['www.sina.com.cn','www.163.com','www.baidu.com','www.cnblogs.com','www.qq.com','www.douban.com']: proc=multiprocessing.Process(target=get,args=(i,lock)) plist.append(proc) for proc in plist: proc.start() for proc in plist: proc.join()
但是呢,我執行起來,卻會死機,會不停的打開python解釋程序。
這樣當然是讓我很納悶的,因為這個程序在ideone(一個在線代碼編譯器)上運行正常,問別人也說可以正常執行,怎么到我這里就不行了呢?
起初我以為是安裝非標準模塊的副作用,于是重裝了一次python2.7.3,然后從網上找了另一個范例試了一下,ok。
我很高興,以為解決問題了,不過為了保險,還是再實驗了一下上面的代碼,又掛了……
這就讓我很郁悶了,看來原因不是python,還是代碼的問題。
可是代碼成功執行了啊……
這個時候,我注意到一個細節,那就是在代碼存放的目錄里,多出來一個字節碼的pyc文件。
看來這個pyc文件應該和這一問題有關……原來如此!
我安裝python的時候,是選擇了預編譯庫文件選項的,這樣可以加快代碼的執行速度。不過這樣就導致了一個問題:預編譯后的字節碼文件的代碼順序和源代碼文件是不太一樣的。裝入字節碼文件時,會自動執行pyc文件里的部分代碼(就是那些貼左面放的部分),而這一執行,就會導致程序發生遞歸,結果就是不斷啟用python解釋執行pyc文件……
然后,然后俺就死機了……
ok,那么我就按我的判斷來修改一下吧,代碼如下:
from multiprocessing import Process import os def myget(url): print os.getpid(),url if __name__ == '__main__': plist=[] for i in ['www.sina.com.cn','www.163.com','www.baidu.com','www.cnblogs.com','www.qq.com','www.douban.com']: proc=Process(target=myget,args=(i,)) plist.append(proc) for proc in plist: proc.start() for proc in plist: proc.join()
下面一句:
if
__name__
=
=
'__main__'
:
的作用是讓后面的代碼只有文件被作為程序執行時才有效,作為庫加載時不執行。
結果很好,成功執行了代碼。
這一事例告訴我們,python官方的代碼格式并不是僅僅出于美觀的,盡可能的按官方風格寫,可以避免很多不可預料的錯誤。