对python多线程与global变量详解


Posted in Python onNovember 09, 2018

今天早上起来写爬虫,基本框架已经搭好,添加多线程爬取功能时,发现出错:

比如在下载文件的url列表中加入200个url,开启50个线程。我的爬虫…竟然将50个url爬取并全部命名为0.html,也就是说,最后的下载结果,是有1个0.html(重复的覆盖了),还有1-150。下面是我的代码:

x = str(theguardian_globle.g)
 #x为给下载的文件命的名
 filePath = "E://wgetWeiBao//"+x+".html"
 try:
  wget.download(url,filePath)
  theguardian_globle.g+=1
  print x+" is downloading..."
 
 except:
  print "error!"
#这个是全局变量g的定义
global g
 
g = 0

后来终于发现问题:多线程+全局变量是个危险的组合,因为程序有多个线程在同时执行,多个线程同时操作全局变量,会引起混乱。在多线程中操作全局变量,应当给该操作加锁。

以下为修改后的代码:

函数:
 
def downLoad(url,num):
 x = str(num)
 filePath = "E://wgetWeiBao//"+x+".html"
 try:
  wget.download(url,filePath)
  print x+" is downloading..."
 
 except:
  print "error!"
多线程消费者_给操作全局变量的语句加锁
class Cosumer(threading.Thread):
 def run(self):
  print('%s:started' % threading.current_thread())
 
  while True:
   global gCondition
   gCondition.acquire()
   while q.empty()==True:
    gCondition.wait()
   url = q.get()
   num = theguardian_globle.g
   theguardian_globle.g+=1
   gCondition.release()
   downLoad(url,num)

大功告成!

以上这篇对python多线程与global变量详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python构造icmp echo请求和实现网络探测器功能代码分享
Jan 10 Python
Python实现的Kmeans++算法实例
Apr 26 Python
详解Python2.x中对Unicode编码的使用
Apr 03 Python
Python环境下安装使用异步任务队列包Celery的基础教程
May 07 Python
Python中列表与元组的乘法操作示例
Feb 10 Python
3个用于数据科学的顶级Python库
Sep 29 Python
详解python配置虚拟环境
Apr 08 Python
六行python代码的爱心曲线详解
May 17 Python
Python 常用模块 re 使用方法详解
Jun 06 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
python使用minimax算法实现五子棋
Jul 29 Python
基于Python新建用户并产生随机密码过程解析
Oct 08 Python
python 多线程中子线程和主线程相互通信方法
Nov 09 #Python
Python文件循环写入行时防止覆盖的解决方法
Nov 09 #Python
对python cv2批量灰度图片并保存的实例讲解
Nov 09 #Python
python进阶之多线程对同一个全局变量的处理方法
Nov 09 #Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 #Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 #Python
浅谈python写入大量文件的问题
Nov 09 #Python
You might like
PHP 强制性文件下载功能的函数代码(任意文件格式)
2010/05/26 PHP
php格式化时间戳显示友好的时间实现思路及代码
2014/10/23 PHP
用javascript实现的激活输入框后隐藏初始内容
2007/06/29 Javascript
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
超级退弹代码
2008/07/07 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
Bootstrap学习笔记之css组件(3)
2016/06/07 Javascript
HTML页面,测试JS对C函数的调用简单实例
2016/08/09 Javascript
AngularJs 利用百度地图API 定位当前位置 获取地址信息
2017/01/18 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
详解处理Vue单页面应用SEO的另一种思路
2018/11/09 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
解决vue项目运行npm run serve报错的问题
2020/10/26 Javascript
[29:10]Ti4 冒泡赛第二天 NEWBEE vs Titan 3
2014/07/15 DOTA
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
python生成每日报表数据(Excel)并邮件发送的实例
2019/02/03 Python
python实现全盘扫描搜索功能的方法
2019/02/14 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
Python列表操作方法详解
2020/02/09 Python
中学家长会邀请函
2014/01/17 职场文书
优良学风班总结材料
2014/02/08 职场文书
志愿者宣传口号
2014/06/17 职场文书
延安红色之旅心得体会
2014/10/07 职场文书
2014年控辍保学工作总结
2014/12/08 职场文书
国庆庆典邀请函
2015/02/02 职场文书
校运会新闻稿
2015/07/17 职场文书
运动会开幕式致辞
2015/07/29 职场文书
小学新课改心得体会
2016/01/22 职场文书