1. 线程简介
- 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。
- 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
- 一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。
2. 为什么要使用线程
- 同一进程中的线程之间共享内存:线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。
- 线程的并发性更高:因为线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
- 线程比进程的性能更好:这是由于同一个进程中的线程共享同一个进程的虚拟空间。线程共享的环境包括进程代码段、进程的公有数据等,利用这些共享的数据,线程之间很容易实现通信。
- 多线程资源消耗更小:操作系统在创建进程时,必须为该进程分配独立的内存空间,并分配大量的相关资源,但创建线程则简单得多。因此,使用多线程来实现并发比使用多进程的性能要高得多。
3. 创建线程的方式
- thread模块在python3中更名为_thread.而且将要废弃。
- python3中通过threading模块创建多线程,创建方法有两种:
- 通过实例化threading.Thread对象来创建:threading.Thread(target=xxx, args=(xxx,xxx))
#!/usr/bin/env python
# coding:utf-8
import threading
import time
def run(n):
print(f'task: {n}')
time.sleep(1)
print('2s')
time.sleep(1)
print('1s')
time.sleep(1)
print('0s')
time.sleep(1)
if __name__ == '__main__':
t1 = threading.Thread(target=run, args=('t1',))
t2 = threading.Thread(target=run, args=('t2',))
t1.start()
t2.start()
- 通过继承threading.Thread类,并重写run方法来创建:MyThread()
#!/usr/bin/env python
# coding:utf-8
import threading
import time
class MyThread(threading.Thread):
def __init__(self, n):
super().__init__()
self.n = n
def run(self):
print(f'task: {self.n}')
time.sleep(1)
print('2s')
time.sleep(1)
print('1s')
time.sleep(1)
print('0s')
time.sleep(1)
if __name__ == '__main__':
t1 = MyThread('t1')
t2 = MyThread('t2')
t1.start()
t2.start()
网友评论