歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

使用Python進行線程編程

對於Python來說,並不缺少並發選項,其標准庫包括了對線程、進程和異步I/O的支持。在許多情況下,通過創建諸如異步、線程和子進程之類的高層模塊,Python簡化了各種並發方法的使用。除了標准庫之外,還有一些第三方的解決方案。例如Twisted、Stackless和進程Module。因為GIL,CPU受限的應用程序無法從線程中受益。使用Python時,建議使用進程,或者混合創建進程和線程。

首先弄清楚進程和線程的區別。線程和進程的不同之處在於,它們共享狀態、內存和資源。對於線程來說,這個簡單的區別既是它的優勢,又是它的缺點。一方面,線程是輕量級的,並且相互之間易於通信,但另一方面,它們也帶來了包括死鎖、爭用條件和好復雜性在內的各種問題。幸運的是,由於GIL和隊列模塊,與采用其他的語言相比,采用Python語言在線程實現的復雜性上要低的多。

《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm

Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm

Python下使用MySQLdb模塊 http://www.linuxidc.com/Linux/2012-06/63620.htm

一個簡單的demo:


#!/usr/bin/env python

import Queue

import threading

import urllib2

import time

 

hosts = ["http://www.baidu.com", "http://www.sina.com.cn", "http://www.letv.com"]

 

class ThreadUrl(threading.Thread):

    def __init__(self, queue):

        threading.Thread.__init__(self)

        self.queue = queue

       

    def run(self):

        while True:

            host = self.queue.get()

            url = urllib2.urlopen(host)

            print url.read(1024)

            self.queue.task_done()

           

def main():

    for i in range(5):

        t = ThreadUrl(queue)

        t.setDaemon(True)

        t.start()

   

    for host in hosts:

        queue.put(host)

   

    queue.join()

 

if __name__ == "__main__":

    start = time.time()

    main()

    print "Elapsed Time:%s" % (time.time() - start)

在Python中使用線程時,這個模型是一種很常見的並且推薦使用的方式。具體工作步驟描述如下:

1. 創建一個Queue.Queue()隊列實例,然後向這個隊列內灌數據。

2. 將灌進數據的實例傳遞給線程類,然後通過繼承threading.Thread的方式創建。

3. 生成守護進程池(t.setDaemon(True))。

4. 每次從queue中pop一個項目,並使用該線程中的數據和run方法以執行相應的工作。

5. 在完成這項工作之後,使用queue.task_done()方法向任務完成的隊列發送一個信號。

6. 對隊列執行join操作,實際上意味著等到queue為空,再退出主程序。

在使用這個模式時需要注意一點:通過將守護線程設置為True,將允許主線程或者程序僅在守護線程處於活動狀態時才能夠退出。這種方式創建了一種簡單的方式以控制程序流程,因為在退出之前,你可以對queue執行join操作或者等到隊列為空。

說明:

join():保持阻塞狀態,直到處理了隊列中的所有項目為止。在將一個項目添加到該隊列時,未完成的任務的總數就會增加。當使用者線程調用task_done()以表示檢索了該項目、並完成了所有的工作時,那麼未完成的任務的總數就會減少。當未完成的任務的總數減少到零時,join()就會結束阻塞狀態。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-07/104898p2.htm

Copyright © Linux教程網 All Rights Reserved