对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脚本来控制Windows Azure的简单教程
Apr 16 Python
简介Python的collections模块中defaultdict类型的用法
Jul 07 Python
python实现媒体播放器功能
Feb 11 Python
Python实现按中文排序的方法示例
Apr 25 Python
python 将数据保存为excel的xls格式(实例讲解)
May 03 Python
Django实现单用户登录的方法示例
Mar 28 Python
django settings.py 配置文件及介绍
Jul 15 Python
python利用re,bs4,requests模块获取股票数据
Jul 29 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
浅谈Python3中print函数的换行
Aug 05 Python
Python爬虫实战之爬取携程评论
Jun 02 Python
Python 多线程处理任务实例
Nov 07 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递归删除目录与文件的方法
2015/01/30 PHP
PHP 错误处理机制
2015/07/06 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
JavaScript Base64编码和解码,实现URL参数传递。
2006/09/18 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
jquery 延迟执行实例介绍
2013/08/20 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
Vue如何实现组件的源码解析
2017/06/08 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
2017/06/12 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
layui table设置前台过滤转义等方法
2018/08/17 Javascript
了解JavaScript中的选择器
2019/05/24 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
原生JavaScript实现轮播图
2021/01/10 Javascript
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
Python编程中的反模式实例分析
2014/12/08 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
2018/11/07 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
面料业务员岗位职责
2013/12/26 职场文书
人事专员的职责
2014/02/26 职场文书
餐饮采购员岗位职责
2014/03/15 职场文书
同学会主持词
2014/03/18 职场文书
优秀教导主任事迹材料
2014/05/09 职场文书
考试作弊检讨书
2014/10/21 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
JS 基本概念详细介绍
2021/10/16 Javascript
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server