对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标准异常和异常处理详解
Feb 02 Python
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
Python获取CPU、内存使用率以及网络使用状态代码
Feb 08 Python
mac 安装python网络请求包requests方法
Jun 13 Python
详解从Django Rest Framework响应中删除空字段
Jan 11 Python
python binascii 进制转换实例
Jun 12 Python
使用 Python 处理 JSON 格式的数据
Jul 22 Python
如何学习Python time模块
Jun 03 Python
Pytorch环境搭建与基本语法
Jun 03 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
Jun 10 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
php排序算法(冒泡排序,快速排序)
2012/10/09 PHP
PHP URL参数获取方式的四种例子
2014/02/28 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
javascript判断iphone/android手机横竖屏模式的函数
2011/12/20 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
2013/05/21 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
2016/05/12 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
nginx配置React静态页面的方法教程
2017/11/03 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
JS实现多功能计算器
2020/10/28 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
使用python读取txt文件的内容,并删除重复的行数方法
2018/04/18 Python
python实现简单tftp(基于udp协议)
2018/07/30 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
python模糊图片过滤的方法
2018/12/14 Python
python获取本机所有IP地址的方法
2018/12/26 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
使用jquery实现HTML5响应式导航菜单教程
2014/04/02 HTML / CSS
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
智利最大的网上商店:Linio智利
2016/11/24 全球购物
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
最常使用的求职信
2014/05/25 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
辣妈辣妹观后感
2015/06/10 职场文书
教育读书笔记
2015/07/02 职场文书
关爱留守儿童主题班会
2015/08/13 职场文书
Java如何实现树的同构?
2021/06/22 Java/Android