对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 相关文章推荐
在Linux下调试Python代码的各种方法
Apr 17 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
Python2随机数列生成器简单实例
Sep 04 Python
python利用requests库模拟post请求时json的使用教程
Dec 07 Python
python模块导入的细节详解
Dec 10 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
Jun 17 Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 Python
python实现猜数字游戏
Mar 25 Python
jupyter notebook的安装与使用详解
May 18 Python
新手常见Python错误及异常解决处理方案
Jun 18 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
运行python提示no module named sklearn的解决方法
Nov 29 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 zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
浅析PHP绘图技术
2013/07/03 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
2016/12/30 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
如何根据业务封装自己的功能组件
2019/04/19 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
Python内置模块turtle绘图详解
2017/12/09 Python
如何利用python制作时间戳转换工具详解
2018/09/12 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
2020/05/22 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
Python configparser模块应用过程解析
2020/08/14 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
Python基于内置函数type创建新类型
2020/10/22 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
htnl5利用svg页面高斯模糊的方法
2018/07/20 HTML / CSS
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
Harman Audio官方商店:购买JBL、Harman Kardon、Infinity和AKG
2019/12/05 全球购物
个人简历自我评价范文
2014/02/04 职场文书
股东合作协议书
2014/04/14 职场文书
环保小标语
2014/06/13 职场文书
元旦趣味活动方案
2014/08/22 职场文书
中华魂放飞梦想演讲稿
2014/08/26 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技