背景:1.py文件中A()函数一直接受消息队列中的消息,并将消息发送给2.py文件中的B()函数,B()函数在接受消息后根据条件进行判断,若符合条件将全局变量flag加1。2.py中的C()函数用来定时查看全局变量flag中的值,若大于某阈值就将True返回给1.py的A()函数,并把全局变量重置为0.
用python3.6写的demo:
1.py
from Py.test.t2 import B
import Py.test.tool as gol
import time
def A():
while True: # 模拟项目中的消息队列
time.sleep(0.3) # 隔0.3秒给B()发一个1
B(1)
if __name__ == '__main__':
A()
2.py
from threading import Timer
import Py.test.tool as gol
gol._init()
gol.set_value('flag', 0) # 全局变量flag
gol.set_value('res', False) # 全局变量res
def B(item):
if item == 1: # 如果得到的值等于1
a = gol.get_value('flag')
gol.set_value('flag', a+1) # 全局变量的值+1
def C(): # 每2秒查看一次全局变量,如果大于1,就将它重置为0
flag = gol.get_value('flag')
if flag > 3:
gol.set_value('res', True)
else:
gol.set_value('res', False)
gol.set_value('flag', 0)
t = Timer(3, C)
t.start()
C()
其中tool类
def _init(): # 初始化
global _global_dict
_global_dict = {}
def set_value(key, value):
""" 定义一个全局变量 """
_global_dict[key] = value
def get_value(key, defValue=None):
""" 获得一个全局变量,不存在则返回默认值 """
try:
return _global_dict[key]
except KeyError:
return defValue
这样运行的话是好用的,在实际项目中发现出现了一些问题,实际项目代码如下,python 环境2.7.5;
1.py
def detect_exec(self):
for index, item in enumerate(self._detect_queue):
themes(item) # 给2.py发消息
2.py
from config import WORDPRESS, WP_PLUGINS, WP_THEMES
from threading import Timer
from modules.wpscan import global_flags as gol
gol._init()
theme_threshold = 1 # 触发阈值
gol.set_value('flag_themes', 0) # 全局变量flag
gol.set_value('res', False) # #全局变量res
def themes(item):
f_themes = gol.get_value('flag_themes')
if item in WP_THEMES:
gol.set_value('flag_themes', f_themes+1)
def check_flag():
f_themes = gol.get_value('flag_themes')
print 'check_flag flag value:', f_themes # 这里打印的值始终为0
if f_themes > theme_threshold:
gol.set_value('res', True)
else:
gol.set_value('res', False)
gol.set_value('flag_themes', 0)
t = Timer(3, check_flag)
t.start()
check_flag()
最后在项目中1.py执行消息队列的for循环之前先调用2.py中的check_flag函数,2.py中调用check_flag那句删掉就好用了,但是没搞清楚是为什么,为什么demo中的就可以正常运行,而项目中的不可以。
改后的文件:
1.py
def detect_exec(self):
check_flag()
for index, item in enumerate(self._detect_queue):
themes(item)
2.py
from config import WORDPRESS, WP_PLUGINS, WP_THEMES
from threading import Timer
from modules.wpscan import global_flags as gol
gol._init()
time = 10
theme_threshold = 50 # 遍历主题的触发阈值
gol.set_value('flag_themes', 0)
gol.set_value('res', False)
def themes(item):
f_themes = gol.get_value('flag_themes')
if item in WP_THEMES:
gol.set_value('flag_themes', f_themes+1)
def check_flag():
f_themes = gol.get_value('flag_themes')
if f_themes > theme_threshold:
gol.set_value('res', True)
else:
gol.set_value('res', False)
gol.set_value('flag_themes', 0)
t = Timer(time, check_flag)
t.start()