对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编码时应该注意的几个情况
Mar 04 Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 Python
Python中的正则表达式与JSON数据交换格式
Jul 03 Python
python tkinter实现屏保程序
Jul 30 Python
利用pyecharts实现地图可视化的例子
Aug 12 Python
python实现超市管理系统(后台管理)
Oct 25 Python
python各层级目录下import方法代码实例
Jan 20 Python
keras读取h5文件load_weights、load代码操作
Jun 12 Python
opencv 图像加法与图像融合的实现代码
Jul 08 Python
Python txt文件常用读写操作代码实例
Aug 03 Python
Python 代码调试技巧示例代码
Aug 11 Python
分享7个 Python 实战项目练习
Mar 03 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
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
php文档更新介绍
2011/07/22 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
Node.js 使用jade模板引擎的示例
2018/05/11 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
python类参数self使用示例
2014/02/17 Python
Python Web框架Flask中使用七牛云存储实例
2015/02/08 Python
Python中用memcached来减少数据库查询次数的教程
2015/04/07 Python
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
解决Python中报错TypeError: must be str, not bytes问题
2020/04/07 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
Python根据字典的值查询出对应的键的方法
2020/09/30 Python
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
汉森冲浪板:Hansen Surfboards
2018/05/19 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
药物学专业学生的自我评价
2013/10/27 职场文书
自荐信范文
2013/12/10 职场文书
运动会邀请函范文
2014/02/06 职场文书
安全生产管理责任书
2014/04/16 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
英语教育专业自荐信
2014/05/29 职场文书
营销学习心得体会
2014/09/12 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
早恋主题班会
2015/08/14 职场文书