对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中的__slots__缓存资源以节省内存开销的方法
Apr 02 Python
python根据日期返回星期几的方法
Jul 06 Python
Python使用cookielib模块操作cookie的实例教程
Jul 12 Python
python实现求最长回文子串长度
Jan 22 Python
Anaconda 离线安装 python 包的操作方法
Jun 11 Python
python 使用 requests 模块发送http请求 的方法
Dec 09 Python
浅谈pyqt5中信号与槽的认识
Feb 17 Python
详解Python学习之安装pandas
Apr 16 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
python配置文件写入过程详解
Oct 19 Python
python excel多行合并的方法
Dec 09 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
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
PHP实现的折半查询算法示例
2017/10/09 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
js判断数据类型如判断是否为数组是否为字符串等等
2014/01/15 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
js中的for如何实现foreach中的遍历
2014/05/31 Javascript
PHP守护进程实例
2015/03/06 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
详解webpack4多入口、多页面项目构建案例
2018/05/25 Javascript
微信小程序中换行空格(多个空格)写法详解
2018/07/10 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
解决Layui数据表格显示无数据提示的问题
2019/11/14 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
python列表操作实例
2015/01/14 Python
Python中使用ElementTree解析XML示例
2015/06/02 Python
Python程序运行原理图文解析
2018/02/10 Python
python写一个md5解密器示例
2018/02/23 Python
Python实现随机漫步功能
2018/07/09 Python
python生成并处理uuid的实现方式
2020/03/03 Python
Django之全局使用request.user.username的实例详解
2020/05/14 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
大宝sod蜜广告词
2014/03/21 职场文书
奠基仪式策划方案
2014/05/15 职场文书
课外活动总结范文
2014/07/09 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
避暑山庄导游词
2015/02/04 职场文书
2015年语文教学工作总结
2015/05/25 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书
优化Mysql查询的示例
2022/04/26 MySQL