首页IT科技python多线程应用(Python中的线程和多线程是什么)

python多线程应用(Python中的线程和多线程是什么)

时间2025-07-30 21:14:34分类IT科技浏览5677
导读:一、线程的概念...

一               、线程的概念

一个进程里面至少有一个控制线程               ,进程的概念只是一种抽象的概念                     ,真正在CPU上面调度的是进程里面的线程,就好比真正在地铁这个进程里面工作的实际上是地铁里面的线程,北京地铁里面至少要有一个线程       ,线程是真正干活的               ,线程用的是进程里面包含的一堆资源,线程仅仅是一个调度单位                     ,不包含资源               。

什么时候需要开启多个线程:一个进程里面的多个线程共享这个进程里面的资源       ,因此如果多个任务共享同一块资源的时候        ,需要开启多个线程                     。 多线程指的是                     ,在一个进程中开启多个线程              ,简单的说:如果多个任务共用同一个资源空间        ,那么必须在一个进程内开启多个线程       。一个进程这个任务里面可能对应多个分任务                      ,如果一个进程里面只开启一个线程的话              ,多个分任务之间实际上是串行的执行效果,即一个程序里面只含有一条执行路径               。

对于计算密集型应用                      ,应该使用多进程;对于IO密集型应用                     ,应该使用多线程                     。线程的创建比进程的创建开销小的多       。

二                     、Python中线程的特点

1.在其他语言当中,一个进程里面开启多个线程               ,每个线程都可以给一个cpu去使用                     ,但是在 python当中       ,在同一时刻               ,一个进程当中只能有一个线程处于运行状态        。

2.比如在其他语言当中                     ,比如我现在开启了一个进程       ,这个进程当中含有几个线程        ,如果我现在有多个cpu                     ,每一个线程是可以对应相应的CPU的                     。

3.但是在python当中              ,如果我们现在开启了一个进程        ,这个进程里面对应多个线程                      ,同一时刻只有一个线程可以处于运行状态              。 对于其他语言而言              ,在多CPU系统中,为了限度的利用多核                      ,可以开启多个线程        。 但是Python中的多线程是利用不了多核优势的                      。

4.在同一个进程当中                     ,多个线程彼此之间可以相互通信;但是进程与进程之间的通信必须基于IPC这种 消息的通信机制(IPC机制包括队列和管道)              。在一个进程当中,改变主线程可能会影响其它线程的行为               ,但是改变父进程并不会影响其它子进程的行为                     ,因为进程与进程之间是完全隔离的。 在python当中       ,在同一时刻同一进程当中只能同时有一个线程在运行               ,如果有一个线程使用了系统调用而阻塞                     ,那么整个进程都会被挂起                      。

三       、多线程的理解

多进程和多线程都可以执行多个任务       ,线程是进程的一部分                     。线程的特点是线程之间可以共享内存和变量        ,资源消耗少(不过在Unix环境中                     ,多进程和多线程资源调度消耗差距不明显              ,Unix调度较快)        ,缺点是线程之间的同步和加锁比较麻烦。

相关推荐:《Python视频教程》

四               、Python多线程创建

在Python中                      ,同样可以实现多线程              ,有两个标准模块thread和threading,不过我们主要使用更高级的threading模块               。使用例子:

importthreading importtime deftarget(): printthecurentthreading%sisrunning%threading.current_thread().name time.sleep(1) printthecurentthreading%sisended%threading.current_thread().name printthecurentthreading%sisrunning%threading.current_thread().name t=threading.Thread(target=target) t.start() t.join() printthecurentthreading%sisended%threading.current_thread().name

输出:

thecurentthreadingMainThreadisrunning thecurentthreadingThread-1isrunning thecurentthreadingThread-1isended thecurentthreadingMainThreadisended

start是启动线程                      ,join是阻塞当前线程                     ,即使得在当前线程结束时,不会退出                     。从结果可以看到               ,主线程直到Thread-1结束之后才结束       。

Python中                     ,默认情况下       ,如果不加join语句               ,那么主线程不会等到当前线程结束才结束                     ,但却不会立即杀死该线程               。如不加join输出如下:

thecurentthreadingMainThreadisrunning thecurentthreadingThread-1isrunning thecurentthreadingMainThreadisended thecurentthreadingThread-1isended

但如果为线程实例添加t.setDaemon(True)之后       ,如果不加join语句        ,那么当主线程结束之后                     ,会杀死子线程                     。

代码:

importthreading importtime deftarget(): printthecurentthreading%sisrunning%threading.current_thread().name time.sleep(4) printthecurentthreading%sisended%threading.current_thread().name printthecurentthreading%sisrunning%threading.current_thread().name t=threading.Thread(target=target) t.setDaemon(True) t.start() t.join() printthecurentthreading%sisended%threading.current_thread().name

输出如下:

thecurentthreadingMainThreadisrunning thecurentthreadingThread-1isrunningthecurentthreadingMainThreadisended

如果加上join,并设置等待时间              ,就会等待线程一段时间再退出:

importthreading importtime deftarget(): printthecurentthreading%sisrunning%threading.current_thread().name time.sleep(4) printthecurentthreading%sisended%threading.current_thread().name printthecurentthreading%sisrunning%threading.current_thread().name t=threading.Thread(target=target) t.setDaemon(True) t.start() t.join(1)

输出:

thecurentthreadingMainThreadisrunning thecurentthreadingThread-1isrunning thecurentthreadingMainThreadisended

主线程等待1秒        ,就自动结束                      ,并杀死子线程       。如果join不加等待时间              ,t.join(),就会一直等待,一直到子线程结束                      ,输出如下:

thecurentthreadingMainThreadisrunning thecurentthreadingThread-1isrunning thecurentthreadingThread-1isended thecurentthreadingMainThreadisended

相关推荐:

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
蓝桥杯a组 上海出线(AcWing – 蓝桥杯集训每日一题(DAY 1——DAY 5)) macbookpro软件无响应(Mac电脑程序无响应怎么办?Mac程序无响应解决方法)