对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 相关文章推荐
在Django中进行用户注册和邮箱验证的方法
May 09 Python
Python探索之ModelForm代码详解
Oct 26 Python
Python面向对象编程之继承与多态详解
Jan 16 Python
matplotlib作图添加表格实例代码
Jan 23 Python
安装python3的时候就是输入python3死活没有反应的解决方法
Jan 24 Python
详解python分布式进程
Oct 08 Python
在Django中URL正则表达式匹配的方法
Dec 20 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
在Django下创建项目以及设置settings.py教程
Dec 03 Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
Jul 02 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 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+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
2006/12/16 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
js 自定义的联动下拉框
2010/02/07 Javascript
js函数返回多个返回值的示例代码
2013/11/05 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
jQuery制作效果超棒的手风琴折叠菜单
2015/04/03 Javascript
一看就懂:jsonp详解
2015/06/01 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
ES6字符串的扩展实例
2020/12/21 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
让Python代码更快运行的5种方法
2015/06/21 Python
python使用psutil模块获取系统状态
2016/08/27 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
JavaScript实现一维数组转化为二维数组
2018/04/17 Python
python-django中的APPEND_SLASH实现方法
2019/06/21 Python
python实现列表的排序方法分享
2019/07/01 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
2020/09/29 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
goodhealth官方海外旗舰店:新西兰国民营养师
2017/12/15 全球购物
2013年员工自我评价范文
2013/12/27 职场文书
承诺书的格式范文
2014/03/28 职场文书
《陈毅探母》教学反思
2014/05/01 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
小学班主任心得体会
2016/01/07 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python
python基于turtle绘制几何图形
2021/06/15 Python