• python多线程编程(1)


    虚拟机层面

    Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,暂时无法利用多处理器的优势。

    语言层面

    在语言层面,Python对多线程提供了很好的支持,Python中多线程相关的模块包括:thread,threading,Queue。可以方便地支持创建线程、互斥锁、信号量、同步等特性。

    thread:多线程的底层支持模块,一般不建议使用。

    threading:对thread进行了封装,将一些线程的操作对象化,提供下列类:

    Thread 线程类

    Timer与Thread类似,但要等待一段时间后才开始运行

    Lock 锁原语

    RLock 可重入锁。使单线程可以再次获得已经获得的锁

    Condition 条件变量,能让一个线程停下来,等待其他线程满足某个“条件”

    Event 通用的条件变量。多个线程可以等待某个事件发生,在事件发生后,所有的线程都被激活

    Semaphore为等待锁的线程提供一个类似“等候室”的结构

    BoundedSemaphore 与semaphore类似,但不允许超过初始值

    Queue:实现了多生产者(Producer)、多消费者(Consumer)的队列,支持锁原语,能够在多个线程之间提供很好的同步支持。提供的类:

    Queue队列

    LifoQueue后入先出(LIFO)队列

    PriorityQueue 优先队列

    其中Thread类是你主要的线程类,可以创建进程实例。该类提供的函数包括:

    getName(self) 返回线程的名字

    isAlive(self) 布尔标志,表示这个线程是否还在运行中

    isDaemon(self) 返回线程的daemon标志

    join(self, timeout=None) 程序挂起,直到线程结束,如果给出timeout,则最多阻塞timeout秒

    run(self) 定义线程的功能函数

    setDaemon(self, daemonic)  把线程的daemon标志设为daemonic

    setName(self, name) 设置线程的名字

    start(self) 开始线程执行

    python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法。而创建自己的线程实例后,通过Thread类的start方法,可以启动该线程,交给python虚拟机进行调度,当该线程获得执行的机会时,就会调用run方法执行线程。

    import threading
    import time
    
    class MyThread(threading.Thread):
    	def run(self):
    		for i in range(3):
    			time.sleep(1)
    			msg = "I'm "+self.name+' @ '+str(i)
    			print msg
    			
    def test():
    	for i in range(5):
    		t = MyThread()
    		t.start()
    
    if __name__=='__main__':
    	test()
    

      

    执行结果:

    I'm Thread-1 @ 0
    I'm Thread-2 @ 0
    I'm Thread-5 @ 0
    I'm Thread-3 @ 0
    I'm Thread-4 @ 0
    I'm Thread-3 @ 1
    I'm Thread-4 @ 1
    I'm Thread-5 @ 1
    I'm Thread-1 @ 1
    I'm Thread-2 @ 1
    I'm Thread-4 @ 2
    I'm Thread-5 @ 2
    I'm Thread-2 @ 2
    I'm Thread-1 @ 2
    I'm Thread-3 @ 2

    从代码和执行结果我们可以看出,多线程程序的执行顺序是不确定的。当执行到sleep语句时,线程将被阻塞(Blocked),到sleep结束后,线程进入就绪(Runnable)状态,等待调度。而线程调度将自行选择一个线程执行。上面的代码中只能保证每个线程都运行完整个run函数,但是线程的启动顺序、run函数中每次循环的执行顺序都不能确定。
    此外需要注意的是:
    1.每个线程一定会有一个名字,尽管上面的例子中没有指定线程对象的name,但是python会自动为线程指定一个名字。
    2.当线程的run()方法结束时该线程完成。
    3. 无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。

    上面的例子只是简单的演示了创建了线程、主动挂起以及退出线程

  • 相关阅读:
    Flink 源码(十一):阅读 Flink 源码前必会的知识(六)高性能异步编程 和 实时流模型关联
    Flink 源码(十):阅读 Flink 源码前必会的知识(五)SPI 和 ClassLoader(二) SPI 技术
    Flink 源码(九):阅读 Flink 源码前必会的知识(四)SPI 和 ClassLoader(一)ClassLoader
    Flink 源码(八):阅读 Flink 源码前必会的知识(三)Java 8 异步编程 CompletableFuture 全解析(三)
    Flink 源码(七):阅读 Flink 源码前必会的知识(二)Java 8 异步编程 CompletableFuture 全解析(二)
    Flink 源码(六):阅读 Flink 源码前必会的知识(一)Java 8 异步编程 CompletableFuture 全解析(一)
    GIT基础(二十四):Git 基本操作(十五)git push 命令
    GIT基础(二十三):Git 基本操作(十四)git pull 命令
    吴恩达机器学习CS229课程笔记学习
    KVM 虚机的创建过程
  • 原文地址:https://www.cnblogs.com/lczit/p/4435742.html
Copyright © 2020-2023  润新知