1.1. 线程
threading.Thread(target = 函数名)
线程的运行是没有先后顺序的
主线程死了,子线程必死。子线程结束后,子线程会给子线程收尸。
当调用Thread的时候,不会创建线程;当调用Thread创建的实例对象的start()时,才会创建线程以及让这个线程开始运行
1.1.1. 概念
python中 import threading
线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
· 子线程与子线程共享全局变量
· 更改全局变量,必须用global吗
在一个函数中,对全局变量进行修改时,到底是否需要使用global进行说明要看是否对全局变量得执行指向进行了修改。
如果修改了指向,既让全局变量指向一个新的地方。那么必须使用global。如果,仅仅是修改指向的空间中的数据,此时不用必须使用global
· 资源竞争
如果多线程
· 线程同步
同步就是协同步调,按预定的先后次序进行运行。
能够保证线程安全的访问竞争资源,最简单的同步机制就是引入互斥锁
· 互斥锁
当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制。
某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能修改;直到该线程释放资源,将资源的状态变成“非锁定”,其他线程才能再次锁定该资源,互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。
· 死锁
在线程间共享多个资源的时候,如果两个线程分别占有一部分的资源,就会造成死锁
1.1.2. 创建线程
· 指定函数为线程
t1 = threading.Thread ( target = 函数名)
t1.start()
· 指定类为线程
首先创建类的时候需要继承threading.Thread,在类里需要一个run()对象
因为继承,所以直接使用对象调用start(),而使用start()时会调用run()
class ss(threading.Thread):
def run():
pass
s1 = ss()
s1.start()
创建一个对象,只能创建一个线程,一个线程只能执行一个函数
· 传参数
t1 = threading,Thread(target = 函数名, args = (gl_list , ) )
传的是元组,当参数为一个的时候,不要忘记,
1.1.3. 常用函数
threading.enumerate()
mutex = threading.Lock()
mutex.acquire()
mutex.release()