python thread 多线程

thread 模块在python3中改为_thread,网上的各种帖子都说不建议新手使用thread,好吃不好吃总得尝尝看。

 1 import _thread
 2
 3 def print_num():
 4     for i in range(100):
 5         print(i)
 6
 7 _thread.start_new_thread(print_num,())
 8 _thread.start_new_thread(print_num,())
 9 _thread.start_new_thread(print_num,())
10 _thread.start_new_thread(print_num,())

你猜运行结果是什么?

啥结果也没有。。。。。。因为主线程没有做任何事情直接就结束了。主线程退出的同时子线程没来得及运行就挂了,

也就是说主线成不会等待子线程执行完才退出。

下面线程锁出场了。

_thread.allocate_lock()生成一个锁,在线程函数开始的时候锁住,结束的时候解锁,主线成通过判断锁的状态决定是否退出。

 1 import _thread
 2
 3 def print_num(lock):        #线程函数
 4
 5     for i in range(100):
 6         print(i)
 7     lock.release()
 8
 9 #生成5把锁
10 locks = []
11 for i in range(5):
12     lock = _thread.allocate_lock()
13     lock.acquire()
14     locks.append(lock)
15 #启动5个线程,每人一把锁
16 for i in range(len(locks)):
17     _thread.start_new_thread(print_num,(locks[i],))
18
19 #主线程分别监视每个锁的状态,知道所有的锁都不是锁定状态,退出
20 for i in range(len(locks)):
21     while locks[i].locked():
22         pass
时间: 2024-11-07 22:39:54

python thread 多线程的相关文章

Python实现多线程HTTP下载器

本文将介绍使用Python编写多线程HTTP下载器,并生成.exe可执行文件. 环境:windows/Linux + Python2.7.x 单线程 在介绍多线程之前首先介绍单线程.编写单线程的思路为: 解析url: 连接web服务器: 构造http请求包: 下载文件. 接下来通过代码进行说明. 解析url 通过用户输入url进行解析.如果解析的路径为空,则赋值为'/':如果端口号为空,则赋值为"80":下载文件的文件名可根据用户的意愿进行更改(输入'y'表示更改,输入其它表示不需要更

python之多线程

声明:示例来源<python核心编程> 前言 单线程处理多个外部输入源的任务只能使用I/O多路复用,如:select,poll,epoll. 特别值得注意的是:由于一个串行程序需要从每个 I/O 终端通道来检查用户的输入,程序在读取 I/O 终端通道时不能阻塞,因为用户输入的到达时间是不确定的,并且阻塞会妨碍其他 I/O 通道的处理. select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责

Python的多线程和多进程模块对比测试

本文主要对比测试Python的多线程和多进程模块在CPU类型和I/O的任务操作时的效率 一 测试CPU消耗类型任务 在一台多核CPU的服务器上执行多线程代码,理论上代码执行时会利用多余的CPU核心来提升性能.但是由于Python的GIL的存在,使用多线程来执行CPU繁重的任务,未必能得到性能提升.但是GIL又必不可少,因为在Python解释器中执行线程是不安全的,也就是说为了保证Python线程执行时的安全,Python提供了一个全局锁,同一时刻,只允许一个线程获得这个全解锁并执行. CPU消耗

自动化测试框架解析2-----关于python的多线程问题

在阅读代码的时候,碰到了python中多线程的问题.在这里做一个记录 mport time  import threading def movie(func): for i in range(2): print "I am watching movie <%s>, time:%s"%(func,time.ctime()) time.sleep(5) def music(func): for i in range(2): print "I am listennig 

Python threading多线程编程示例

Python 的多线程有两种实现方法: 函数,线程类 1.函数 调用 thread 模块中的 start_new_thread() 函数来创建线程,以线程函数的形式告诉线程该做什么 # -*- coding: utf-8 -*- import thread def f(name): #定义线程函数 print "this is " + name if __name__ == '__main__': thread.start_new_thread(f, ("thread1&qu

【python】多线程编程

使用多线程编程和一个共享的数据结构如queue,这种程序任务可以用多个功能单一的线程来组织: UserRequestThread:负责读取客户的输入,可能是一个I/O信道.程序可能创建多个线程,每个客户一个,请求会被放入队列中 RequestProcessor:一个负责从队列中获取并处理请求的线程,它为下面那种线程提供输出 ReplyThread:负责把给用户的输出取出来,如果是网络应用程序就把结果发送出去,否则就保存到本地文件系统或数据库中. 一个顺序执行单线程的例子: from time i

python中多线程调度机制以及GIL

总结下python中线程调度机制. 对于线程调度机制而言,同操作系统的进程调度一样,最关键是要解决两个问题: 1.在何时选择挂起当前线程,并选择处于等待的先一个线程呢? 2.在众多等待的线程中,选择哪一个作为激活线程呢? 在python多线程机制中,这个两个问题是有两个层次解决的. 如,进程间的切换,当发生了时钟中断,操作系统响应时钟中断,并在这个时候开始进程的调度. 同样的,python也是通过软件模拟了这样的时钟中断,来激激活线程的调度. 我们知道,python字节码解释器是按照指令,顺序一

[ Python - 11 ] 多线程及GIL全局锁

1. GIL是什么? 首先需要明确的一点是GIL并不是python的特性, 它是在实现python解析器(Cpython)时所引入的一个概念. 而Cpython是大部分环境下默认的python执行环境,要明确一点:GIL并不是python的特性,python完全可以不依赖于GIL. 2. 为什么会有GIL? 为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据的一致性和状态同步的完整性 (例如:线程2需要线程1执行完成的结果,然而线程2又比线程1代码量少,线程2

python thread local的用法

python 中多线程的并发跟其他语言一样,需要考虑多线程并发访问去全局变量所带来的问题,python的local类解决了这个问题,通过它让每个线程内部有一个相对独立的local保存数据,某一个线程修改了数据,不影响其他线程中保存的数据. 1 from threading import Thread 2 import threading 3 import time 4 local_value=threading.local() 5 local_value.x='en' 6 class threa