--------------------------第一種: 主線程 和 n個線程 同時啟動,主線程執行完了,所有線程都結束
#coding=utf-8
import time
from selenium import webdriver
import threading
def fun1(a):
print a
def fun2():
print 222
threads = []
threads.append(threading.Thread(target=fun1,args=(u'愛情買賣',))) #args為函數接受的參數,多個參數可以傳入多個 args=(u'愛情買賣',u'愛情買賣')
threads.append(threading.Thread(target=fun2))
print(threads)
if __name__ == '__main__':
for t in threads:
t.setDaemon(True) #我拿來做selenium自動化模擬多個用戶使用瀏覽器的時候,加了這個就啟動不了,要去掉,原因找到了 : 加了這個是說明 主線程 執行完了 子線程也停止(無論是否執行完畢)
t.start()
print "all over %s" %ctime()
代碼說明:
import threading
首先導入threading 模塊,這是使用多線程的前提。
threads = []
t1 = threading.Thread(target=fun1,args=(u'愛情買賣',))
threads.append(t1)
創建了threads數組,創建線程t1,使用threading.Thread()方法,在這個方法中調用music方法target=music,args方法對music進行傳參。 把創建好的線程t1裝到threads數組中。
接着以同樣的方式創建線程t2,並把t2也裝到threads數組。
for t in threads:
t.setDaemon(True) #加了這個 只要 主線程走完了,子線程無論有沒執行完 都一起停止。 可以加這個,然后主線程 那里寫個判斷外部txt文件的值,手動改為1就執行完畢,所有線程都停止了
t.start()
最后通過for循環遍歷數組。(數組被裝載了t1和t2兩個線程)
setDaemon()
setDaemon(True)將線程聲明為守護線程,必須在start() 方法調用之前設置,如果不設置為守護線程程序會被無限掛起。子線程啟動后,父線程也繼續執行下去,當父線程執行完最后一條語句print "all over %s" %ctime()后,沒有等待子線程,直接就退出了,同時子線程也一同結束。
start()
開始線程活動。
從執行結果來看,子線程(muisc 、move )和主線程(print "all over %s" %ctime())都是同一時間啟動,但由於主線程執行完結束,所以導致子線程也終止。
-----------------------------第二種,要等待所有子線程都執行完畢,主線程才執行完畢 腳本才停止:
if __name__ == '__main__': for t in threads: t.setDaemon(True) t.start() t.join() print "all over %s" %ctime()
我們只對上面的程序加了個join()方法,用於等待線程終止。join()的作用是,在子線程完成運行之前,這個子線程的父線程將一直被阻塞。
注意: join()方法的位置是在for循環外的,也就是說必須等待for循環里的兩個進程都結束后,才去執行主進程。
后記:
搞了個並發瀏覽器操作,
如果要做參數化,用ddt會導致所有行為都在一個瀏覽器操作,去掉ddt框架后,並發正常 (這里可能是把dirver 定義成全局變量導致的問題!!!!! 去掉后正常)
threading庫 知識點補充: https://www.cnblogs.com/kaibindirver/p/12717924.html
參考:
https://www.cnblogs.com/xxswkl/p/11110728.html
https://www.cnblogs.com/fnng/p/3670789.html
蟲師那個seleniumpdf里面還有其他方法 可以參考
中文文檔: https://docs.python.org/3/library/threading.html?highlight=threading#module-threading
另外一篇 thread 庫的https://www.cnblogs.com/kaibindirver/p/12698603.html