记录一个Timer中使用全局变量的问题

背景: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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值