thread模块—Python多线程编程

Thread 模块

*注:在实际使用过程中不建议使用 thread 进行多线程编程,本文档只为学习(或熟悉)多线程使用。

Thread 模块除了派生线程外,还提供了基本的同步数据结构,称为锁对象(lock object,也叫原语锁、互斥锁、互斥和二进制信号量)。

常用线程函数以及 LockType 锁对象的方法:

函数/方法 描述
thread 模块的函数  
start_new_thread(function, args, kwargs=None) 派生一个新的线程,使用给定的 args 和可选的 kwargs 来执行 function
allocate_lock() 分配 LockType 锁对象
exit() 给线程退出指令
LockType 锁对象方法  
acquire(wait=None) 尝试获取锁对象
locked() 如果获取了锁对象则返回True,否则返回 Flase
release() 释放锁

使用 thread 模块的简单例子,代码如下(mtsleepA.py):

 1 import thread
 2 from time import sleep, ctime
 3 ?
 4 def loop0():
 5     print ‘start loop 0 at:‘, ctime()
 6     sleep(4)
 7     print ‘loop 0 Done at:‘, ctime()
 8 ?
 9 def loop1():
10     print ‘start loop 1 at:‘, ctime()
11     sleep(2)
12     print ‘loop 1 Done at:‘, ctime()
13 ?
14 def main():
15     print ‘starting at:‘, ctime()
16     thread.start_new_thread(loop0, ())
17     thread.start_new_thread(loop1, ())
18     sleep(6)
19     print ‘all DONE at:‘, ctime()
20 ?
21 if __name__ == ‘__main__‘:
22     main()

输出结果:

1 starting at: Sun Jul 22 21:38:00 2018
2 start loop 0 at: Sun Jul 22 21:38:00 2018
3  start loop 1 at: Sun Jul 22 21:38:00 2018
4 loop 1 Done at: Sun Jul 22 21:38:02 2018
5 loop 0 Done at: Sun Jul 22 21:38:04 2018
6 all DONE at: Sun Jul 22 21:38:06 2018

在这个脚本的代码中,增加了一个 sleep(6) 调用,为什么要这么做呢?这是因为如果我们没有阻止主线程继续执行,它将会继续执行下一条语句,显示“all done”然后退出,而 loop0() 和 loop1() 这两个线程将直接终止。


使用线程和锁的简单例子,代码如下(mtsleepB.py):

 1 import thread
 2 from time import sleep, ctime
 3 ?
 4 loops = [4,2]
 5 ?
 6 def loop(nloop, nsec, lock):
 7     print ‘start loop‘, nloop, ‘at:‘, ctime()
 8     sleep(nsec)
 9     print ‘loop‘, nloop, ‘done at:‘, ctime()
10     lock.release() # 释放锁
11 ?
12 def main():
13     print ‘starting at:‘, ctime()
14     locks = []
15     nloops = range(len(loops))
16 ?
17     for i in nloops:
18         lock = thread.allocate_lock() # 分配 LockType 对象
19         lock.acquire() # 尝试获取锁对象
20         locks.append(lock)
21 ?
22     for i in nloops:
23         thread.start_new_thread(loop, (i, loops[i], locks[i])) # 派生新线程
24
25     for i in nloops:
26         # 等待所有锁释放后退出循环继续后面操作
27         while locks[i].locked(): # 当获取了锁的时候为 True,所有的锁都释放后为 Flase
28             pass
29 ?
30     print ‘all DONE at:‘, ctime()
31 ?
32 if __name__ == ‘__main__‘:
33     main()
输出结果为:
1 starting at: Sun Jul 22 22:25:45 2018
2 start loop 1 at:start loop Sun Jul 22 22:25:45 2018
3  0 at: Sun Jul 22 22:25:45 2018
4 loop 1 done at: Sun Jul 22 22:25:47 2018
5 loop 0 done at: Sun Jul 22 22:25:49 2018
6 all DONE at: Sun Jul 22 22:25:49 2018

main() 函数中锁相关的主要流程(第一个 for 循环)解释:

  1. 首先创建一个锁列表,通过使用 thread.allocate_lock() 函数得到锁对象;
  2. 再通过 acquire() 方法取得每个锁(取得锁的效果相当于“把锁锁上”);
  3. 把锁锁上后将它添加到锁列表 locks 中;

为什么不在上锁的循环中启动线程呢?

  • 第一,想要同步线程,让所有的线程最后同时都完成;
  • 第二,获取锁需要花费一点时间,避免线程执行的太快,在获取锁之前线程就执行结束。

原文地址:https://www.cnblogs.com/tester-xt/p/9387943.html

时间: 2024-09-29 03:28:04

thread模块—Python多线程编程的相关文章

threading模块—Python多线程编程

Threading 模块 threading 模块除了提供基本的线程和锁定支持外,还提供了更高级别.功能更全面的线程管理.threading 模块支持守护线程,其工作方式是:守护线程一般是一个等待客户端请求的服务器,如果没有客户端请求,守护线程就是空闲的.如果把一个线程设置为守护线程,就表示这个线程是不重要的,进程退出时不需要等待这个线程完成.(如何设置守护线程?只需执行赋值语句: thread.daemon = True ) threading 模块的对象: 对象 描述 Thread 表示一个

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多线程编程-queue模块和生产者-消费者问题

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

python多线程编程----threading模块

1.threading 模块中的内容 - Thread: 一个可执行线程对象 - Lock: 原始的Lock对象 与thread模块中一样 - RLock: 允许单个线程多次请求的Lock - Condition: 线程等待直到条件满足 - Event : 事件发生时,唤醒所有等待进程 - Semaphore:信号量,标识有限资源的个数 - Timer: 定时启动线程 - Barrier: 等待指定的所有的进程都来到 2.daemon threads 守护进程 如果你的主线程准备退出,并且你并不

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多线程编程—同步原语入门(锁Lock、信号量(Bounded)Semaphore)

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

C++使用thread类进行多线程编程

C++11中引入了一个用于多线程操作的thread类,简单多线程示例: #include <iostream> #include <thread> #include <Windows.h> using namespace std; void thread01() { for (int i = 0; i < 5; i++) { cout << "Thread 01 is working !" << endl; Sleep(