对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从MP3文件获取id3的方法
Jun 15 Python
机器学习经典算法-logistic回归代码详解
Dec 22 Python
Python各类图像库的图片读写方式总结(推荐)
Feb 23 Python
python实现猜单词小游戏
May 22 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
Jul 17 Python
python读出当前时间精度到秒的代码
Jul 05 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
Python matplotlib绘制饼状图功能示例
Sep 10 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 Python
pytorch查看模型weight与grad方式
Jun 24 Python
Python之字典对象的几种创建方法
Sep 30 Python
python3 hdf5文件 遍历代码
May 19 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
各种战术和打法的原创者
2020/03/04 星际争霸
php中截取字符串支持utf-8
2007/01/18 PHP
php不用正则采集速度探究总结
2008/03/24 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
php中JSON的使用与转换
2015/01/14 PHP
yii分页组件用法实例分析
2015/12/28 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
JS中==与===操作符的比较
2009/03/21 Javascript
JavaScript 拾漏补遗
2009/12/27 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
2013/11/30 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
[01:44]Ti10举办地公布
2019/08/25 DOTA
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
2014/01/19 Python
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
python分割文件的常用方法
2014/11/01 Python
Python数组定义方法
2016/04/13 Python
python方向键控制上下左右代码
2018/01/20 Python
python3.x实现发送邮件功能
2018/05/22 Python
python批量获取html内body内容的实例
2019/01/02 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
python 模拟登录B站的示例代码
2020/12/15 Python
学前教育专业毕业生自荐信
2013/10/03 职场文书
高中生毕业自我鉴定范文
2013/12/22 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
女性健康讲座主持词
2015/07/04 职场文书
python常见的占位符总结及用法
2021/07/02 Python