Python学习笔记(六):多线程、XML、JSON(快速入门篇)

以下是入门python看自强学堂的笔记,网址为http://www.ziqiangxuetang.com/python/python-tutorial.html

同时,补充阅读有http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000

Head First Python、Python基础教程

多线程

多线程类似于同时执行多个不同程序,多线程运行有如下优点:

  • 使用线程可以把占据长时间的程序中的任务放到后台去处理。
  • 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
  • 程序的运行速度可能加快
  • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

线程在执行过程中与进程还是有区别的。每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。

指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。

  • 线程可以被抢占(中断)。
  • 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -这就是线程的退让。

Python中使用线程有两种方式:函数或者用类来包装线程对象。

函数包装线程对象

函数式:调用thread模块中的start_new_thread()函数来产生新线程。语法如下:

thread.start_new_thread ( function, args[, kwargs] )
参数说明:
function - 线程函数。
args - 传递给线程函数的参数,必须是个tuple类型。
kwargs - 可选参数。

线程的结束一般依靠线程函数的自然结束;也可以在线程函数中调用thread.exit(),他抛出SystemExit exception,达到退出线程的目的。

线程模块

Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。

thread 模块提供的其他方法:

threading.currentThread():  返回当前的线程变量。
threading.enumerate():      返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activeCount():    返回正在运行的线程数量,与len(threading.enumerate())有相同的结果


除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:

run():          用以表示线程活动的方法。
start():        启动线程活动。
join([time]):   等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
isAlive():      返回线程是否活动的。
getName():      返回线程名。
setName():      设置线程名。

使用Threading模块创建线程

使用Threading模块创建线程,直接从threading.Thread继承,然后重写–init–方法和run方法

import threading
import time

exitFlag = 0

class myThread (threading.Thread):   #继承父类threading.Thread
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):                   #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数 
        print "Starting " + self.name
        print_time(self.name, self.counter, 5)
        print "Exiting " + self.name

def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            thread.exit()
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1


thread1 = myThread(1, "Thread-1", 1)        # 创建新线程
thread1.start() # 开启线程

线程同步

如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。

使用Thread对象的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire方法和release方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间。如下:

多线程的优势在于可以同时运行多个任务(至少感觉起来是这样)。但是当线程需要共享数据时,可能存在数据不同步的问题。

线程优先级队列( Queue)

Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。

Queue模块中的常用方法:

Queue.qsize()                   返回队列的大小
Queue.empty()                   如果队列为空,返回True,反之False
Queue.full()                    如果队列满了,返回True,反之False
Queue.full                      与 maxsize 大小对应
Queue.get([block[, timeout]])   获取队列,timeout等待时间
Queue.get_nowait()              相当Queue.get(False)
Queue.put(item)                 写入队列,timeout等待时间
Queue.put_nowait(item)          相当Queue.put(item, False)
Queue.task_done()               在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
Queue.join()                    实际上意味着等到队列为空,再执行别的操作

XML解析

XML 指可扩展标记语言(eXtensible Markup Language)。 你可以通过本站学习XML教程

XML 被设计用来传输和存储数据。

XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。

它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。

python对XML的解析

python有三种方法解析XML,SAX,DOM,以及ElementTree:

  • SAX (simple API for XML )

    pyhton 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

  • DOM(Document Object Model)

    将XML数据在内存中解析成一个树,通过对树的操作来操作XML。

  • ElementTree(元素树)

    ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。

注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)。

使用SAX解析xml

SAX是一种基于事件驱动的API。利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。

解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;

而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。

1、对大型文件进行处理;

2、只需要文件的部分内容,或者只需从文件中得到特定信息。

3、想建立自己的对象模型的时候。

在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。

ContentHandler类方法介绍
  • characters(content)方法

    调用时机:

    从行开始,遇到标签之前,存在字符,content的值为这些字符串。

    从一个标签,遇到下一个标签之前, 存在字符,content的值为这些字符串。

    从一个标签,遇到行结束符之前,存在字符,content的值为这些字符串。

    标签可以是开始标签,也可以是结束标签。

  • startDocument()方法

    文档启动的时候调用。

  • endDocument()方法

    解析器到达文档结尾时调用。

  • startElement(name, attrs)方法

    遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。

  • endElement(name)方法

    遇到XML结束标签时调用。

make_parser方法
xml.sax.make_parser( [parser_list] )    #创建一个新的解析器对象并返回
参数说明:
parser_list - 可选参数,解析器列表
parser方法
xml.sax.parse( xmlfile, contenthandler[, errorhandler]) #创建一个 SAX 解析器并解析xml文档
参数说明:
xmlfile - xml文件名
contenthandler - 必须是一个ContentHandler的对象
errorhandler - 如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象
parseString方法
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])  #创建一个XML解析器并解析xml字符串
参数说明:
xmlstring - xml字符串
contenthandler - 必须是一个ContentHandler的对象
errorhandler - 如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象

实例(SAX、DOM)

链接:http://www.ziqiangxuetang.com/python/python-xml.html

JSON

学堂链接:http://www.ziqiangxuetang.com/python/python-json.html

官方文档:https://docs.python.org/2/library/json.html

总结

自强学堂篇就总结到这里,觉得是最基本的入门吧~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值