Python 2.7线程中修改变量的正确性及实现方法咨询
线程修改同模块全局变量的正确性验证
用户提供的代码
main.py主逻辑
... val1, val2 = None, None ... thread1 = threading.Thread(func1, ) thread1.start() while condition: continue else: thread1.join() # 检查线程修改后的val1和val2值 if val1!= None and val2!= None: do_something()
func1函数定义
... def func1(): global val1, val2 val1, val2 = process_something_and_return_values()
用户的问题
- 这样定义func1()能否保证val1和val2被修改且不再为None?
- 如果不能,该如何通过线程修改变量?
- 补充:使用Python 2.7
- 更新:确认同模块下上述代码是否正确?
解答
同模块下的代码正确性
你用global声明修改全局变量的写法是正确的,Python同模块内的线程可以通过这种方式修改全局变量,不存在跨模块的问题。关于val1和val2是否能保证不为None
这完全取决于process_something_and_return_values()的返回结果:- 如果该函数稳定返回两个非None的值,那func1执行后val1、val2肯定会被更新为非None;
- 如果函数返回的是包含None的结果(比如(None, 123)),那你的判断条件就不会触发
do_something(); - 另外要确保主线程的
while condition循环能正确退出,进入else块执行thread1.join()——只有等待线程执行完毕后,再去检查变量才是可靠的。如果condition一直为True,主线程会卡在循环里,永远不会走到变量检查的逻辑。
线程修改变量的其他可靠方案
- 用类实例属性替代全局变量:避免全局变量的混乱,代码更易维护,示例如下:
class DataHolder: def __init__(self): self.val1 = None self.val2 = None def func1(holder): holder.val1, holder.val2 = process_something_and_return_values() # 主线程逻辑 holder = DataHolder() thread1 = threading.Thread(target=func1, args=(holder,)) thread1.start() thread1.join() # 直接等待线程结束,替代while循环逻辑 if holder.val1 is not None and holder.val2 is not None: do_something() - 使用线程安全容器:比如
queue.Queue,线程把结果放入队列,主线程从队列取出,天然线程安全,适合多线程协作的场景; - 注意:Python 2.7里判断变量是否为None,推荐用
is not None而非!= None,更符合Python编码习惯,执行效率也更高。
- 用类实例属性替代全局变量:避免全局变量的混乱,代码更易维护,示例如下:
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

