使用Python進行線程編程(1)

來源:互聯網
上載者:User

Tag:Python 隊列 線程
在實習中學習了Python,到現在不大兩個月,寫了個1000行的指令碼,但是多線程效率太低,固有此文,如果錯誤,敬請指正。

這是看一篇文章:http://www.ibm.com/developerworks/cn/aix/library/au-threadingpython/?ca=drs-tp3008後的吸收和筆記,原文資訊非常多,推薦原文。

簡介:通過將線程和隊列結合在一起,建立一些簡單有效模式,以解決需要並發處理的問題。

效果就像學校食堂排隊打飯一樣,大媽手裡的勺子不會歇著。

1、簡單的多個線程處理:

View Code

 1 import threading
2 import datetime
3
4 class ThreadClass(threading.Thread):
5 def run(self):
6 now = datetime.datetime.now()
7 print "%s says Hello World at time: %s" %
8 (self.getName(), now)
9
10 for i in range(2):
11 t = ThreadClass()
12 t.start()

第七行代碼打錯了,不應該換行,這個是原文粘貼過來的
定義了一個繼承自threading.Thread的類,重定義了run()方法,即啟動線程後要處理的事情,然後啟動兩個線程知道任務處理完成。

2、以處理大量URL為例,這次放上整個例子,原文的代碼有點亂,我稍作了整理:
只是不好意思,我寫的有點拖遝
注釋:為了處理一個URL隊列,定義了兩個繼承自threading.Thread的類,重定義了__init__()和run()方法
ThreadURL:這個線程類用來從隊列中取出一個URL產生BS包,把處理結果儲存到out_queue中
ThreadPrint:用來處理ThreadURL儲存到out_queue的結果,原理與ThreadURL一樣
第一個函數:GetBSFromURL(),用來從URL產生BeautifulSoup包
流程:
定義兩個隊列,queue用來儲存要處理的任務,out_queue用來儲存處理結果,處理結果也要用隊列線程處理
啟動5個線程ThreadURL,初始化,產生守護線程池,啟動線程,每個線程處理完成時,通過queue的task_done()向隊列發送一個處理完成訊號,可以處理下一個任務,這樣輪番處理queue中的URL
開始向queue隊列填充要處理的工作清單
啟動m個線程ThreadPrint,用來處理結果,方法同上
queue.join()
out_queue.join()
等待隊列為空白,所有任務處理完成,程式退出

View Code

 1 # -*- coding:utf-8 -*-
2 '''
3 Created on Oct 8, 2011
4
5 @author: Lannik Cooper
6 '''
7 import urllib2
8 from BeautifulSoup import BeautifulSoup
9 import json
10 import time
11 import threading
12 from mx import DateTime
13 import Queue
14
15 def GetBSFromURL(url):
16 soup=None
17 while True:
18 try:
19 f=urllib2.urlopen(url)
20 if f!=None:
21 soup=BeautifulSoup(f)
22 f.close()
23 if soup!=None:
24 break
25 pass
26 except:
27 time.sleep(3)
28 pass
29 pass
30 return soup
31
32
33 class ThreadURL(threading.Thread):
34 def __init__(self,queue,out_queue):
35 threading.Thread.__init__(self)
36 self.queue=queue
37 self.out_queue=out_queue
38 pass
39
40 def run(self):
41 while True:
42 host=self.queue.get()
43 soup=GetBSFromURL(host)
44 self.out_queue.put(soup)
45 self.queue.task_done()
46 pass
47 pass
48
49 class ThreadPrint(threading.Thread):
50 def __init__(self,out_queue):
51 threading.Thread.__init__(self)
52 self.out_queue=out_queue
53 pass
54 def run(self):
55 while True:
56 soup=self.out_queue.get()
57 print soup.title.text
58 self.out_queue.task_done()
59 pass
60 pass
61 pass
62
63 def main():
64 hosts=["http://google.com.hk", "http://t.qq.com", "http://amazon.cn","http://www.baidu.com", "http://t.sina.com"]
65 start=time.time()
66 queue=Queue.Queue()
67 out_queue=Queue.Queue()
68 for i in range(5):
69 t=ThreadURL(queue,out_queue)
70 t.setDaemon(True)
71 t.start()
72 pass
73 for host in hosts:
74 queue.put(host)
75 pass
76 for i in range(1):
77 t=ThreadPrint(out_queue)
78 t.setDaemon(True)
79 t.start()
80 pass
81 queue.join()
82 out_queue.join()
83 print "Elapsed Time: %s" % (time.time() - start)
84 pass
85
86 main()

這樣就完成了線程結合隊列進行多執行緒。

 

問題:
由於看的時間很短,原文備忘中提到的文章還沒來得及看,所以很多東西還是不清楚,比如Thread的setDaemon(),守護線程池的作用不是很清楚。
待有所獲後再補一篇文章。

現在正是校園招聘火熱期,時間很糾結,GDT要用好。
待續。。。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.