对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 相关文章推荐
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
python正则表达式面试题解答
Apr 28 Python
Python实现读取Properties配置文件的方法
Mar 29 Python
mac安装scrapy并创建项目的实例讲解
Jun 13 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
Python使用tkinter模块实现推箱子游戏
Oct 08 Python
Python序列化pickle模块使用详解
Mar 05 Python
对python中各个response的使用说明
Mar 28 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 Python
python如何爬取网页中的文字
Jul 28 Python
python爬取微博评论的实例讲解
Jan 15 Python
详解Python模块化编程与装饰器
Jan 16 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新手上路(十一)
2006/10/09 PHP
Ajax PHP简单入门教程代码
2008/04/25 PHP
队列在编程中的实际应用(php)
2010/09/04 PHP
解析PHP中如何将数组变量写入文件
2013/06/06 PHP
解析php中获取url与物理路径的总结
2013/06/21 PHP
php生成mysql的数据字典
2016/07/07 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
jQuery查询数据返回object和字符串影响原因是什么
2013/08/09 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
原生JS:Date对象全面解析
2016/09/06 Javascript
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
常用的js方法合集
2017/03/10 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
js实现打字小游戏
2019/12/17 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
[01:44]Ti10举办地公布
2019/08/25 DOTA
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
如何更优雅地写python代码
2019/07/02 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
提升python处理速度原理及方法实例
2019/12/25 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
什么是Python变量作用域
2020/06/03 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
中秋节礼品促销方案
2014/02/02 职场文书
PHP实现创建以太坊钱包转账等功能
2021/04/21 PHP