- Python的標準庫提供了兩個模組:
_thread
和threading
,_thread
是低級模組,threading
是進階模組,對_thread
進行了封裝。絕大多數情況下,只需要使用threading
這個模組。 import threadingfrom time import ctime,sleep
def func1(func): print u" 我是函數%s.此刻列印時間: %s" %(func,ctime()) sleep(5) print u‘%s再次列印時間%s‘ % (func,ctime())
def func2(func): print u"我是函數 %s此刻列印時間: %s" %(func,ctime()) sleep(5) print u‘%s再次列印時間%s‘%(func,ctime())
threads = []t1 = threading.Thread(target=func1,args=(‘func1‘,)) #建立線程,args傳參必須以元組方式傳入 threads.append(t1)t2 = threading.Thread(target=func2,args=(‘func2‘,))#建立線程,args傳參必須以元組方式傳入
threads.append(t2)
if __name__ == ‘__main__‘:
for t in threads:
# t.setDaemon(True) #設定守護線程(主線程退出,子線程也會退出,不會掛起佔用資源)
t.start() #啟動線程
print u‘指令碼結束時間%s‘%ctime()
運行結果:(注意setDaemon())
我是函數func1.此刻列印時間: Fri Sep 07 15:43:15 2018我是函數 func2此刻列印時間: Fri Sep 07 15:43:15 2018指令碼結束時間Fri Sep 07 15:43:15 2018 #(三個都是同一時間列印)
func1再次列印時間Fri Sep 07 15:43:20 2018 func2再次列印時間Fri Sep 07 15:43:20 2018 #(兩個都為等待5秒後同事列印)
說明;func1,func2都是同時一時間執行任務了,但是為什麼指令碼結束時間先列印了,原因是主線程被分成兩個子線程同時運行,但是子線程有等待5秒但主線程沒有等待就直接執行了列印了;
- 我們稍作改進:
import threadingfrom time import ctime,sleepdef func1(func): print u" 我是函數%s.此刻列印時間: %s" %(func,ctime()) sleep(5) print u‘%s再次列印時間%s‘ % (func,ctime())def func2(func): print u"我是函數 %s此刻列印時間: %s" %(func,ctime()) sleep(5) print u‘%s再次列印時間%s‘%(func,ctime())threads = []t1 = threading.Thread(target=func1,args=(‘func1‘,))threads.append(t1)t2 = threading.Thread(target=func2,args=(‘func2‘,))threads.append(t2)if __name__ == ‘__main__‘: for t in threads: # t.setDaemon(True) #設定守護線程(主線程退出,子線程也會退出,不會掛起佔用資源) t.start() for t in threads:
t.join() # 等待線程執行結束
print u‘指令碼結束時間%s‘%ctime()
我是函數func1.此刻列印時間: Fri Sep 07 16:09:29 2018我是函數 func2此刻列印時間: Fri Sep 07 16:09:29 2018func1再次列印時間Fri Sep 07 16:09:34 2018func2再次列印時間Fri Sep 07 16:09:34 2018指令碼結束時間Fri Sep 07 16:09:34 2018
主線程執行到,然後等待子線程;
- 上個第一次使用線程寫東西的項目吧,去年剛開始寫爬蟲因為數量多所以網上到處找資料,東拼西湊總算給我搞出來了
#encoding:utf-8import requestsimport threadingfrom lxml import etreeimport codecs,csvdef return_link(): Link = [] for i in range(2000): url="http://www.xzgsj.gov.cn/baweb/show/shiju/gg.jsp?fenceid=95000000&total=45192&queryType=6&pagenum="+str(i)+"&action=gg.jsp?ssid=ZxSlh1DBkGGpV2hnWMSt5PG7f8FPjTbvH78vJ1nFcwYyMhWzGBzy!1470507879!1500631589968&findWenhao=&findName=" Link.append(url) return Linkdef get_href(): while True: lock.acquire() if len(Link) == 0: lock.release() break else: url = Link.pop(0) lock.release() r = requests.get(url, headers=headers).content print url pages = etree.HTML(r.decode(‘utf-8‘)) a = pages.xpath(u"//table[@width=‘700‘]/tr[position()>1]/td/a/@onclick") for i in a: a = i.replace(‘javaScript:window.open(\‘‘, ‘‘).replace(‘\‘,\‘a\‘,\‘width=550 height=350\‘)‘, ‘‘) url = ‘http://www.xzgsj.gov.cn/baweb/show/shiju/‘ + a with codecs.open(‘url.csv‘,‘ab‘) as f: w = csv.writer(f) w.writerow([url])if __name__ == ‘__main__‘: headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" } lock = threading.Lock()#線程鎖 Link = return_link() tasks = [] # 工作清單 for x in range(5): t = threading.Thread(target=get_href) # 準備線程函數及參數 t.setDaemon(True) # 設定守護線程(主線程退出,子線程也會退出,不會掛起佔用資源) tasks.append(t) for t in tasks: t.start() # 啟動多線程(工作清單有多少個值,就會啟動多少個線程) for t in tasks: t.join() # 等待線程執行結束
View Code
- 使用Threading模組建立線程,直接從threading.Thread繼承,然後重寫__init__方法和run方法:(和第一個例子一樣只是基於類的使用)
import threadingfrom time import ctime,sleepclass myThread(threading.Thread): # 繼承父類threading.Thread def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): # 把要執行的代碼寫到run函數裡面 線程在建立後會直接運行run函數 print "Starting " + self.name,u‘時間{}‘.format(ctime()) sleep(5) print "Exiting " + self.name,u‘時間{}‘.format(ctime())# 建立新線程thread1 = myThread(1, "Thread-1", 1)thread2 = myThread(2, "Thread-2", 2)# 開啟線程tasks = []tasks.append(thread1)tasks.append(thread2)if __name__ == ‘__main__‘: for t in tasks: # t.setDaemon(True) #設定守護線程(主線程退出,子線程也會退出,不會掛起佔用資源) t.start() for t in tasks: t.join() # 等待線程執行結束 print u‘指令碼結束時間%s‘%ctime()
結果:
Starting Thread-1 時間Fri Sep 07 17:13:53 2018Starting Thread-2 時間Fri Sep 07 17:13:53 2018
Exiting Thread-1 時間Fri Sep 07 17:13:58 2018
Exiting Thread-2 時間Fri Sep 07 17:13:58 2018
指令碼結束時間Fri Sep 07 17:13:58 201
- 第一篇over,以後想到再加吧