您的位置:首页 > 编程语言 > Python开发

python 采用 BoundedSemaphore 限制多进程访问qps

2017-09-19 01:11 288 查看
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 19 00:06:12 2017

@author: 37652
"""

import threading
import time
import timer2
import requests

def showfun(n):
requests.get("http://test.com/")
print "here\n"

def release():
print "%s begin start release =============== \n" %(time.ctime())
# 增加之前 先清除之前遗留的 避免出现遗留计数器影响下一秒qps
while semlock.acquire(blocking=0):
pass
# 增加计数器
for i in range(20):
try:
semlock.release()
except Exception, e:
# 出现异常 进行推出 理想状态是出现计数器自增超过配额
# TODO 未对异常进行细分
print "\n======",e
break
print "%s end start release =============== \n" %(time.ctime())

if __name__ == '__main__':
maxconnections = 20   # 计数器最大值
semlock = threading.BoundedSemaphore(maxconnections)

reThread = timer2.apply_interval(1000, release) # 每秒钟进行一次计数器释放

list=[]
i = 0
while True:
semlock.acquire()
i+=1
t=threading.Thread(target=showfun, args=(i,))
list.append(t)
t.start()
if time.time() > 1505754200:   # 测试结束时间戳
break

for j in list:
j.join()
reThread.cancel()
注: python threading 模块内 有两个计数器 同步原语
Semaphore 无上限
BoundedSemaphore 初始设置最大值 如果release调用超过最大值则出ValueError
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python