对线程的简单理解
线程(thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
单线程:所有任务都得按照顺序执行;
多线程:一个主线程,多个线程同时运行完成任务,多线程之间可以资源共享;
线程同步:如果资源有限,就会产生冲突。解决冲突可以排队等待、或通信;
互斥锁:共享的资源有1个,多线程竞争时一般互斥锁同步;
递归锁:又称可重入锁。已经获得递归锁的线程可以继续多次获得该锁,而不会被阻塞,释放的次数必须和获取的次数相同才会真正释放该锁。
信号量(semaphore):共享的资源有多个,多线程竞争时一般使用信号量(Semaphore)同步;
线程守护属性设置:主线程永远是最后退出的,如果主线程已经完成,多线程是否立即结束;
进程:进程之间不能共享资源,但可以通过管道传递信息,也可以共享内存。
线程创建并使用
使用threading模块的Thread类创建线程。
import threading #导入模块
def fuc(a,b,c):
pass
thread1 = threading.Thread(target=fuc, (a, b, c)) #实例化创建线程1
thread2 = threading.Thread(target=函数名, 函数参数) #实例化创建线程2
thread1.start() #开启新线程1
thread2.start() #开启新线程2
threads = []
threads.append(thread1)
threads.append(thread2)
for t in threads:
t.join() #等待所有线程完成
print("主线程退出!") #退出
注:
函数参数传递有多种方式:
元组传递 args=(参数1,参数2,…)
字典传递 kwargs={“参数名”: 参数1, “参数名”: 参数2, …}
以及混合传参 args=(参数1, 参数2, …), kwargs={“参数名”: 参数1,“参数名”: 参数2, …}
自定义线程类创建线程,继承threading.Thread类。
import threading
import time
class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print ("开始线程:" + self.name)
fuc(a, b, c)
print ("退出线程:" + self.name)
def fuc(a, b, c):
pass
# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# 开启新线程
thread1.start()
thread2.start()
#等待线程完成
thread1.join()
thread2.join()
print ("退出主线程")