學習python多線程和多進程的一點感想

jopen 12年前發布 | 88K 次閱讀 Python 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官方的代碼格式并不是僅僅出于美觀的,盡可能的按官方風格寫,可以避免很多不可預料的錯誤。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!