线程优点:
数据共享:
不安全现象:
GIL锁(全局解释锁):导致了同一个进程中的多个线程不能利用多核
def func():
print(‘线程‘)
t = Thread(target=func)
t.daemon = True # 守护进程
t.start()
# 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。
from threading import Thread,Lock
x = 100
lock = Lock()
def task():
global x
lock.acquire()
x -= 1
print(x)
lock.release()
if __name__ == ‘__main__‘:
t_l1 = []
for i in range(10):
t = Thread(target=task)
t_l1.append(t)
t.start()
for i in t_l1:
i.join()
print(f‘主{x}‘)
死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁
from threading import Thread,RLock
lockA = lockB = RLock()
class MyThread(Thread):
def run(self):
self.f1()
self.f2()
def f1(self):
lock_A.acquire()
print(f‘{self.name}拿到A锁‘)
lock_B.acquire()
print(f‘{self.name}拿到B锁‘)
lock_B.release()
lock_A.release()
def f2(self):
lock_B.acquire()
print(f‘{self.name}释放B锁‘)
time.sleep(0.1)
lock_A.acquire()
print(f‘{self.name}释放A锁‘)
lock_A.release()
lock_B.release()
if __name__ == ‘__main__‘:
for i in range(10):
t = MyThread()
t.start()
print(‘主程序结束‘)
import queue #不需要通过threading模块里面导入,直接import queue就可以了,这是python自带的
#用法基本和我们进程multiprocess中的queue是一样的
q=queue.Queue()
q.put(‘1‘)
q.put(‘2‘)
q.put(‘3‘)
# q.put_nowait() #没有数据就报错,可以用try
print(q.get())
print(q.get())
print(q.get())
# q.get_nowait() #没有数据就报错,可以用try
# 1 2 3
import queue
q=queue.LifoQueue() #队列,类似于栈,栈我们提过吗,是不是先进后出的顺序啊
q.put(‘1‘)
q.put(‘2‘)
q.put(‘3‘)
print(q.get())
print(q.get())
print(q.get())
# 3 2 1
import queue
q=queue.PriorityQueue()
#put进入一个元组,元组的第一个元素是优先级(通常是数字,也可以是非数字之间的比较),数字越小优先级越高
q.put((-10,‘a‘))
q.put((-5,‘a‘)) #负数也可以
# q.put((20,‘ws‘)) #如果两个值的优先级一样,那么按照后面的值的acsii码顺序来排序,如果字符串第一个数元素相同,比较第二个元素的acsii码顺序
# q.put((20,‘wd‘))
# q.put((20,{‘a‘:11})) #TypeError: unorderable types: dict() < dict() 不能是字典
# q.put((20,(‘w‘,1))) #优先级相同的两个数据,他们后面的值必须是相同的数据类型才能比较,可以是元祖,也是通过元素的ascii码顺序来排序
q.put((20,‘b‘))
q.put((20,‘a‘))
q.put((30,‘c‘))
print(q.get())
print(q.get())
print(q.get())
from threading import Thread,Semaphore
from threading import current_thread
import time
# 同时只有3个线程可以获得semaphore,即可以限制最大连接数为3
sem = Semaphore(3)
def func():
sem.acquire()
print(f‘{current_thread().getName()}阻塞一下‘)
time.sleep(2)
sem.release()
if __name__ == ‘__main__‘:
for i in range(20):
t = Thread(target=func)
t.start()
原文:https://www.cnblogs.com/tonxin66/p/13123735.html