python并发编程之多线程
Posted 薛才昌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python并发编程之多线程相关的知识,希望对你有一定的参考价值。
一 什么是线程
在传统操作系统中,每一个进程都有一个地址空间,而且默认就有一个控制线程
线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程工作车间负责吧资源整合到一起,是一个资源单位,而一个车间内至少有一个流水线
进程只是用来把资源集中到一起,二线程才是cpu上的的执行单位
线程是代码的运行过程
二 为何要用线程
1.同一个进程下,多个线程共享该进程下的资源
2.线程比进程开销要小得多
三 开启线程的两种方式
#方式一 from threading import Thread import time def sayhi(name): time.sleep(2) print(‘%s say hello‘ %name) if __name__ == ‘__main__‘: t=Thread(target=sayhi,args=(‘egon‘,)) t.start() print(‘主线程‘)
#方式二 from threading import Thread import time class Sayhi(Thread): def __init__(self,name): super().__init__() self.name=name def run(self): time.sleep(2) print(‘%s say hello‘ % self.name) if __name__ == ‘__main__‘: t = Sayhi(‘egon‘) t.start() print(‘主线程‘)
四 线程相关的其他方法
Thread实例对象的方法 # isAlive(): 返回线程是否活动的。 # getName(): 返回线程名。 # setName(): 设置线程名。 threading模块提供的一些方法: # threading.currentThread(): 返回当前的线程变量。 # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
from threading import Thread import threading from multiprocessing import Process import os def work(): import time time.sleep(3) print(threading.current_thread().getName()) if __name__ == ‘__main__‘: #在主进程下开启线程 t=Thread(target=work) t.start() print(threading.current_thread().getName()) print(threading.current_thread()) #主线程 print(threading.enumerate()) #连同主线程在内有两个运行的线程 print(threading.active_count()) print(‘主线程/主进程‘) ‘‘‘ 打印结果: MainThread <_MainThread(MainThread, started 140735268892672)> [<_MainThread(MainThread, started 140735268892672)>, <Thread(Thread-1, started 123145307557888)>] 主线程/主进程 Thread-1 ‘‘‘
五 守护线程
from threading import Thread import time def sayhi(name): time.sleep(2) print(‘%s say hello‘ %name) if __name__ == ‘__main__‘: t=Thread(target=sayhi,args=(‘egon‘,)) t.setDaemon(True) #必须在t.start()之前设置 t.start() print(‘主线程‘) print(t.is_alive()) ‘‘‘ 主线程 True ‘‘‘
六 死锁现象与递归锁
所谓死锁:是指两个或以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待现象,如无外力作用, 它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。
from threading import Thread,Lock import time mutexA=Lock() mutexB=Lock() class MyThread(Thread): def run(self): self.func1() self.func2() def func1(self): mutexA.acquire() print(‘