threading
python 实现多任务可是使用线程、进程、协程,本文介绍python线程解决多任务,多线程共享全局变量,共享全局变量就会造成资源竞争,解决资源竞争可是使用互斥锁,使用互斥锁会赵成的问题是阻塞,一个主线程中多个子线程使用多个互斥锁的情况会造成死锁。
以上问题解决方法:
资源竞争:解决资源竞争使用互斥锁
互斥锁:什么是互斥锁,直白的说就是,谁先拿到谁先上锁,上锁后别人就不能再上锁也不能再使用
解决阻塞:解决阻塞的意思就是,上锁的代码越少越好,但是又会造成另外一个问题,就是会频繁的上锁解锁,这个也是需要时间,所以具体的选择要看业务需求,这个无法十全十美
死锁:就是一个主线程中有多个子线程,又有多个互斥锁,他们都在相互的等待对方的资源,就会造成死锁,1、解决死锁的方法就是给互斥锁添加超时时间\2、程序设计的时候避免,也就是使用银行家算法
并行与并发
1、并行 :真的多任务(CPU核数>任务数)
1、并发 :假的多任务(CPU核数<任务数)[计算机底层实现,可能是时间切片,也可能是优先级调度]
知识点
1、多线程中,主线程等待子线程结束后再结束
2、多线程共享全局变量
3、线程是资源调度的最小单位
多线程造成的问题
1、资源竞争的问题
2、使用互斥锁解决资源竞争会出现的情况是会造成阻塞(还是单任务)
2、一个主线程里多个子线程。使用多个互斥锁的情况会造成的问题是死锁
解决多线程的问题
1、使用互斥锁(在可能出现资源竞争的地方使用互斥锁)
2、使用互斥锁的原则是,上锁的代码越少越好(同样的问题是会造成加锁和上锁的耽误时间)
解释互斥锁:互斥所的特性,同一把锁,只能上锁一次,这样就能保证同意时刻是能有一个对象上锁
mutex = threading.Lock() # 创建锁对象(对象默认是没有锁上的状态)
mutex.acquire() # 上锁
mutex.release() # 解锁
1、多线程传参
import threading
import time
def test1(temp):
temp.append(33)
print("-----in test1 temp=%s----" % str(temp))
def test2(temp):
print("-----in test2 temp=%s----" % str(temp))
g_nums = [11, 22]
def main():
# target指定将来 这个线程去哪个函数执行代码
# args指定将来调用 函数的时候 传递什么数据过去
t1 = threading.Thread(target=test1, args=(g_nums,)) # 参数接收的为元组
t2 = threading.Thread(target=test2, args=(g_nums,))
t1.start() # 开始线程
t2.start()
if __name__ == "__main__":
main()