对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进阶教程之文本文件的读取和写入
Aug 29 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
快速排序的四种python实现(推荐)
Apr 03 Python
Python逐行读取文件内容的方法总结
Feb 14 Python
解决Jupyter因卸载重装导致的问题修复
Apr 10 Python
Python unittest discover批量执行代码实例
Sep 08 Python
Python调用JavaScript代码的方法
Oct 27 Python
2021年值得向Python开发者推荐的VS Code扩展插件
Jan 25 Python
python正则表达式re.match()匹配多个字符方法的实现
Jan 27 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 Python
python基础之错误和异常处理
Oct 24 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
各种咖啡的英文名子是什么
2021/03/03 新手入门
在WIN98下以apache模块方式安装php
2006/10/09 PHP
php过滤XSS攻击的函数
2013/11/12 PHP
php 读取输出其他文件的实现方法
2016/07/26 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
鼠标图片振动代码
2006/07/06 Javascript
JavaScript表单常用验证集合
2008/01/16 Javascript
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
Vue.js实现一个todo-list的上移下移删除功能
2017/06/26 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
vue element-ui中table合计指定列求和实例
2020/11/02 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
python实现简单井字棋游戏
2020/03/04 Python
python实现文件分片上传的接口自动化
2020/11/19 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
python中@contextmanager实例用法
2021/02/07 Python
2014工程部年度工作总结
2014/12/17 职场文书
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript