对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实现ipsec开权限实例
Nov 11 Python
python通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
python实现在sqlite动态创建表的方法
May 08 Python
python实现数独算法实例
Jun 09 Python
浅谈python中requests模块导入的问题
May 18 Python
python实现多人聊天室
Mar 31 Python
transform python环境快速配置方法
Sep 27 Python
浅析Python 实现一个自动化翻译和替换的工具
Apr 14 Python
Django集成搜索引擎Elasticserach的方法示例
Jun 04 Python
python调用支付宝支付接口流程
Aug 15 Python
Python下载网易云歌单歌曲的示例代码
Aug 12 Python
Appium+Python实现简单的自动化登录测试的实现
Jan 26 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实现的美国50个州选择列表实例
2015/04/20 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
在IE中调用javascript打开Excel的代码(downmoon原作)
2007/04/02 Javascript
Prototype Class对象学习
2009/07/19 Javascript
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
NodeJS使用formidable实现文件上传
2016/10/27 NodeJs
js获取ip和地区
2017/03/10 Javascript
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
微信小程序使用二次贝塞尔曲线画波浪
2018/12/25 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
浅析python 中__name__ = '__main__' 的作用
2014/07/05 Python
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
Python去除字符串两端空格的方法
2015/05/21 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
Python实现调度算法代码详解
2017/12/01 Python
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
Python 利用OpenCV给照片换底色的示例代码
2020/08/03 Python
解决pytorch 保存模型遇到的问题
2021/03/03 Python
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
上班时间打瞌睡检讨书
2014/09/26 职场文书
无刑事犯罪记录证明范本
2014/09/29 职场文书
受资助学生感谢信
2015/01/21 职场文书
班主任寄语2015
2015/02/26 职场文书
个人自荐书范文
2015/03/09 职场文书
会计求职自荐信
2015/03/26 职场文书
考博导师推荐信范文
2015/03/27 职场文书
电力工程合作意向书
2015/05/11 职场文书
社团招新宣传语
2015/07/13 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers