python 一個文件里面多個函數同時執行( 多線程 的方法,並發)--多線程 threading


 

--------------------------第一種: 主線程 和 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM