对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代码检查工具pylint 让你的python更规范
Sep 05 Python
Python中用Ctrl+C终止多线程程序的问题解决
Mar 30 Python
使用beaker让Facebook的Bottle框架支持session功能
Apr 23 Python
Python中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
Python 异常处理的实例详解
Sep 11 Python
Python星号*与**用法分析
Feb 02 Python
python2.7 json 转换日期的处理的示例
Mar 07 Python
解决pytorch-yolov3 train 报错的问题
Feb 18 Python
python读取xml文件方法解析
Aug 04 Python
Python操控mysql批量插入数据的实现方法
Oct 27 Python
Python实现Word文档转换Markdown的示例
Dec 22 Python
教你用python实现12306余票查询
Jun 30 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处理换行符的问题 \r\n
2013/06/13 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
php swoft框架实例用法
2020/12/22 PHP
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
2015/02/13 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
JavaScript模拟实现键盘打字效果
2015/06/29 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
js继承实现方法详解
2016/12/16 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
Vue 进入/离开动画效果
2017/12/26 Javascript
Vue导出页面为PDF格式的实现思路
2018/07/31 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
ES6的解构赋值实例详解
2019/05/06 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python学习笔记之os模块使用总结
2014/11/03 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
Python @property使用方法解析
2019/09/17 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
python如何实现递归转非递归
2021/02/25 Python
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
国窖1573广告词
2014/03/21 职场文书
2014年采购部工作总结
2014/11/20 职场文书
万里长城导游词
2015/01/30 职场文书
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL