当前位置:首页 > Python技术文章 > 对python多线程与global变量详解

解析python多线程与global变量

  • 发布时间:
  • 作者:码农之家原创
  • 点击:67

这篇文章主要知识点是关于python、多线程、global、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

自学Python编程基础学习笔记
  • 类型:Python手册大小:16.1 MB格式:PDF作者:python程序员
立即下载

对python多线程与global变量详解

今天早上起来写爬虫,基本框架已经搭好,添加多线程爬取功能时,发现出错:

比如在下载文件的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变量详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

推荐内容

pygame游戏之旅 如何添加icon和bgm音效

总结vue spa应用中的路由缓存问题及解决办法

分享springboot打包不同环境配置和shell脚本部署

jQuery图片切换插件jquery.cycle.js实例效果

实例讲解小程序input框失焦事件在提交事件前的处理

展开 +

收起 -

Python 相关电子书
学习笔记
网友NO.820312

Python 爬虫学习笔记之多线程爬虫

XPath 的安装以及使用 1 . XPath 的介绍 刚学过正则表达式,用的正顺手,现在就把正则表达式替换掉,使用 XPath,有人表示这太坑爹了,早知道刚上来就学习 XPath 多省事 啊。其实我个人认为学习一下正则表达式是大有益处的,之所以换成 XPath ,我个人认为是因为它定位更准确,使用更加便捷。可能有的人对 XPath 和正则表达式的区别不太清楚,举个例子来说吧,用正则表达式提取我们的内容,就好比说一个人想去天安门,地址的描述是左边有一个圆形建筑,右边是一个方形建筑,你去找吧,而使用 XPath 的话,地址的描述就变成了天安门的具体地址。怎么样?相比之下,哪种方式效率更高,找的更准确呢? 2 . XPath 的安装 XPath 包含在 lxml 库中,那么我们到哪里去下载呢? 点击此处 ,进入网页后按住 ctrl+f 搜索 lxml ,然后进行下载,下载完毕之后将文件……

网友NO.238669

Python中关于多线程Threading入门简介

多线程可简单理解为同时执行多个任务。本文给大家分享Python 多线程Threading初学教程实例详解,感兴趣的朋友一起学习吧 1.1 什么是多线程 Threading 多线程可简单理解为同时执行多个任务。 多进程和多线程都可以执行多个任务,线程是进程的一部分。线程的特点是线程之间可以共享内存和变量,资源消耗少(不过在Unix环境中,多进程和多线程资源调度消耗差距不明显,Unix调度较快),缺点是线程之间的同步和加锁比较麻烦。 1.2 添加线程 Thread 导入模块 import threading 获取已激活的线程数 threading.active_count() 查看所有线程信息 threading.enumerate() 查看现在正在运行的线程 threading.current_thread() 添加线程, threading.Thread() 接收参数target代表这个线程要完成的任务,需自行定义 def thread_job(): print('This is a thread of %s' % threading.current_thread())def main(): thread = threading.Th……

网友NO.298318

Python多线程原理与用法详解

本文实例讲述了Python多线程原理与用法。分享给大家供大家参考,具体如下: 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。[1] 在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。 创建并启动一个线程 import threadingdef runtask(name): print("%s线程已启动"%name)t = threading.Thread(target=……

网友NO.423053

Python多线程中线程间资源共享和常用的锁机制的介绍

本篇文章给大家带来的内容是关于Python多线程中线程间资源共享和常用的锁机制的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 本文将简单介绍多线程编程中的线程间资源共享和常用的锁机制。 在多线程编程中,常常会涉及到线程间的资源共享, 常用资源共享常用方式: 全局变量(global) queue(from queue import Queue) 常用的资源共享锁机制: Lock RLock Semphore Condition (一) 线程间资源共享 使用全局变量可以实现线程间的资源共享,关键字global 代码演示: from threading import Thread, Locklock = Lock()total = 0'''如果不使用lock那么,最后得到的数字不一定为0;同时loack不支持连续多次acquire,如果这样做了的后果是死锁!'''def add(): global total global lock for i in range(1000000): lock.acquire() total += 1 lock.release() def sub(): global total global lock for i in range(10000……

网友NO.360055

Python基于多线程实现抓取数据存入数据库的方法

本文实例讲述了Python基于多线程实现抓取数据存入数据库的方法。分享给大家供大家参考,具体如下: 1. 数据库类 """使用须知:代码中数据表名 aces ,需要更改该数据表名称的注意更改"""import pymysqlclass Database(): # 设置本地数据库用户名和密码 host = "localhost" user = "root" password = "" database = "test" port = 3306 charset = "utf8" cursor='' connet ='' def __init__(self): #连接到数据库 self.connet = pymysql.connect(host = self.host , user = self.user,password = self.password , database = self.database, charset = self.charset) self.cursor = self.connet.cursor() # #删表 def dropTables(self): self.cursor.execute('''''drop table if exists aces''') print("删表") #建表 def createTables(self): self.cursor.execute('''''create table if not exists aces ( asin varchar(11) primary key not null, checked varchar(200));''') print("建表") #保存数据 def save(self,aceslist): self.cursor.execute("insert in……

<
1
>

电子书 编程教程 文档 软件 源码 视频

Copyright 2018-2020 xz577.com 码农之家

本站所有电子书资源不再提供下载地址,只分享来路

免责声明:网站所有作品均由会员网上搜集共同更新,仅供读者预览及学习交流使用,下载后请24小时内删除

版权投诉 / 书籍推广 / 赞助:QQ:520161757