Python多线程变量溢出问题,python多线程溢出,代码如下python#!
Python多线程变量溢出问题,python多线程溢出,代码如下python#!
代码如下
python#!/usr/bin/env python# -*- coding: utf-8 -*-import socket,time,threadingtask_num=0lock = threading.Lock()def loop4thread(): global task_num while task_num < 100: lock.acquire() try: print "%s Doing NO.%d Task..." %(threading.current_thread().name , task_num) task_num+=1 finally: lock.release()onethread=[ 0 for x in range(10)]for i in range(10) : onethread[i] = threading.Thread(target=loop4thread,name="Threadloop"+str(i)) onethread[i].start()
输出结果 最后一行是
Doing No.108 Task...
可是我在loop4thread函数中写了 在 task_num <100 才执行啊,
为什么 task_num 溢出到 108 呢
这是数据同步的问题, 需要改成这样:
def loop4thread(): global task_num while True: lock.acquire() if task_num >= 100: lock.release() break try: print "%s Doing NO.%d Task..." %(threading.current_thread().name , task_num) task_num+=1 finally: lock.release()
你之前的代码的问题: 假如现在task_num小于100(假设就是99), 执行到lock.acquire()可能会因为其他线程已经获取锁而block, 同时其它线程可能正要对task_num做task_num+=1操作, 等你lock.acquire()返回时task_num就已经不是99了, 可能是100或更大的值.
改过之后的代码目的就是在lock.acquire()返回后, 当前线程获取锁再检测task_num, 这期间其他线程会因为无法获取锁而block, 也就不会改变task_num的值.
编橙之家文章,
相关内容
- 要用python获取内存中数据该怎么写,python怎么写,from
- python判断长字符串关键字的方法,python字符串关键字
- ansible批量部署全局命令如何实现,ansible部署全局,刚接
- 谁能帮我解释下这段python源码中logging的作用是什么?,
- Python大级别数运算问题,python级别运算,用hashlib.sha
- 求实现Python脚本判断中文字符是否为同一姓名思路方法
- Python SQLAlchemy定义触发器、存储过程是怎样实现的,p
- 没有编程基础能学好python语言吗,编程基础python,没有任
- flask调试不开httpserver提供静态文件应该怎么操作,fla
- 请问一个窗口内可以运行python多个线程吗?,一个窗口
评论关闭