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. 无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。

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

时间: 2024-10-12 12:57:30

python多线程编程(1)的相关文章

python 多线程编程

一)线程基础 1.创建线程: thread模块提供了start_new_thread函数,用以创建线程.start_new_thread函数成功创建后还能够对其进行操作. 其函数原型: start_new_thread(function,atgs[,kwargs]) 其參数含义例如以下: function: 在线程中运行的函数名 args:元组形式的參数列表. kwargs: 可选參数,以字典的形式指定參数 方法一:通过使用thread模块中的函数创建新线程. >>> import th

Python多线程编程

原文 运行几个线程和同时运行几个不同的程序类似,它有以下好处: 一个进程内的多个线程和主线程分享相同的数据空间,比分开不同的过程更容易分享信息或者彼此通信. 线程有时叫做轻量化过程,而且他们不要求更多的内存开支:它们比过程便宜. 一个线程的顺序是:启动,执行和停止.有一个指令指针跟踪线程正在运行的上下文在哪里. 它可以被抢占(中断) 它能暂时被挂起(也叫做休眠),而别的线程在运行--这也叫做yielding(让步). 开始一个新线程: 要生成一个线程,需要调用在thread模块中方法如下: th

day-3 聊聊python多线程编程那些事

python一开始给我的印象是容易入门,适合应用开发,编程简洁,第三方库多等等诸多优点,并吸引我去深入学习.直到学习完多线程编程,在自己环境上验证完这句话:python解释器引入GIL锁以后,多CPU场景下,也不再是并行方式运行,甚至比串行性能更差.不免有些落差,一开始就注定了这门语言迟早是有天花板的,对于一些并行要求高的系统,python可能不再成为首选,甚至是完全不考虑.但是事情也并不是绝对悲观的,我们已经看到有一大批人正在致力优化这个特性,新版本较老版本也有了一定改进,一些核心模块我们也可

python多线程编程—同步原语入门(锁Lock、信号量(Bounded)Semaphore)

摘录python核心编程 一般的,多线程代码中,总有一些特定的函数或者代码块不希望(或不应该)被多个线程同时执行(比如两个线程运行的顺序发生变化,就可能造成代码的执行轨迹或者行为不相同,或者产生不一致的数据),比如修改数据库.更新文件或其他会产生竞态条件的类似情况.此时就需要同步了. 同步:任意数量的线程可以访问临界区的代码,但在给定的时刻又只有一个线程可以通过时. 这里介绍两个基本的同步类型原语:锁/互斥.信号量 锁 锁有两种状态:锁定和未锁定.与之对应的是两个函数:获得锁和释放锁. 当多线程

python多线程编程(2): 使用互斥锁同步线程

上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1.很容易写出这样的代码: # encoding: UTF-8import threadingimport time class MyThread(threading.Thread): def run(self): global num time.sleep(1) num = num+1 msg = self.name+' set

python多线程编程-queue模块和生产者-消费者问题

摘录python核心编程 本例中演示生产者-消费者模型:商品或服务的生产者生产商品,然后将其放到类似队列的数据结构中.生产商品中的时间是不确定的,同样消费者消费商品的时间也是不确定的. 使用queue模块(python2.x版本中,叫Queue)来提供线程间通信的机制,从而让线程之间可以分享数据.具体而言,就是创建一个队列,让生产者(线程)在其中放入新的商品,而消费者(线程)消费这些商品. 下表是queue模块的部分属性: 属性 描述 queue模块的类 Queue(maxsize=0) 创建一

thread模块—Python多线程编程

Thread 模块 *注:在实际使用过程中不建议使用 thread 进行多线程编程,本文档只为学习(或熟悉)多线程使用. Thread 模块除了派生线程外,还提供了基本的同步数据结构,称为锁对象(lock object,也叫原语锁.互斥锁.互斥和二进制信号量). 常用线程函数以及 LockType 锁对象的方法: 函数/方法 描述 thread 模块的函数   start_new_thread(function, args, kwargs=None) 派生一个新的线程,使用给定的 args 和可

Python多线程编程之多线程加锁

Python语言本身是支持多线程的,不像PHP语言. 下面的例子是多个线程做同一批任务,任务总是有task_num个,每次线程做一个任务(print),做完后继续取任务,直到所有任务完成为止. 1 #coding:utf-8 2 import threading 3 4 start_task = 0 5 task_num = 10000 6 mu = threading.Lock() ###通过工厂方法获取一个新的锁对象 7 8 class MyThread(threading.Thread):

python多线程编程(5): 队列同步

前面介绍了互斥锁和条件变量解决线程间的同步问题,并使用条件变量同步机制解决了生产者与消费者问题. 让我们考虑更复杂的一种场景:产品是各不相同的.这时只记录一个数量就不够了,还需要记录每个产品的细节.很容易想到需要用一个容器将这些产品记录下来. Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue.这些队列都实现了锁原语,能够在多线程中直接使用.可以使用队列来实现线程