对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中zip()函数用法实例教程
Jul 31 Python
python实现简单的计时器功能函数
Mar 14 Python
Python入门_浅谈数据结构的4种基本类型
May 16 Python
python reduce 函数使用详解
Dec 05 Python
flask中主动抛出异常及统一异常处理代码示例
Jan 18 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
Jun 12 Python
python提取log文件内容并画出图表
Jul 08 Python
python数据持久存储 pickle模块的基本使用方法解析
Aug 30 Python
python 子类调用父类的构造函数实例
Mar 12 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
Django分页器的用法你都了解吗
May 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
DISCUZ 分页代码
2007/01/02 PHP
swfupload 多文件上传实现代码
2008/08/27 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
js+html制作简单日历的方法
2017/06/27 Javascript
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
javascript使用正则实现去掉字符串前面的所有0
2018/07/23 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python实现解析Bit Torrent种子文件内容的方法
2017/08/29 Python
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
python实现QQ邮箱发送邮件
2020/03/06 Python
python能否java成为主流语言吗
2020/06/22 Python
事业单位人员的自我评价范文
2014/09/21 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书