线程队列,线程池和协程
线程的其他方法:
threading.current_thread() #当前线程对象
getName() # 获取线程名
ident # 获取线程id
threading.enumerate() # 当前正在运行的线程对象的一个列表
threading.active_count() # 当前正在运行的线程数量
import time from threading import Thread,current_thread def f1(n): print(f"{n}号线程正在运行") print("子线程的名称",current_thread().getName()) if __name__ == '__main__': t = Thread(target=f1,args=(1,),name = '123') t.start() print("主线程的名称", current_thread().getName())
线程队列:(重点)
import queue
先进先出队列:queue.Queue(3)
先进后出\后进先出队列:queue.LifoQueue(3)
优先级队列:queue.priorityQueue(3)
put的数据是一个元组,元组的第一个参数是优先级数字,数字越小优先级越高,越先被get到被取出来,第二个参数是put进去的值,如果说优先级相同,那么值别忘了应该是相同的数据类型,字典不行
import queue # q = queue.Queue(3) # q.put(1) # q.put(2) # print(q.qsize()) # try : # q.put_nowait(3) # except : # print('满了') # print(q.full()) # # print(q.get()) # print(q.get()) # print(q.get()) q = queue.PriorityQueue(3) q.put((2,'white')) q.put((1,'卢本伟')) q.put((2,'55开')) print(q.get()) print(q.get()) print(q.get())
线程池:
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
t = ThreadPoolExecutor(4) #默认的线程个数是cpu个数 * 5
p = ProcessPoolExecutor(4) #默认的进程个数是cpu个数
t.map(f1,可迭代的对象) #异步执行
import time from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor def f1(n): time.sleep(1) print(n) if __name__ == '__main__': t = ThreadPoolExecutor(5) t.map(f1,range(10)) t.shutdown() print('主程序结束')
def f1(n1,n2):
print(n1,n2)
t.submit(f1,11,12) #异步提交任务
res = t.submit(f1,11,12)
res.result() #和get方法一样,如果没有结果,会等待,阻塞程序
shutdown() # close+join,锁定线程池,等待线程池中所有已经提交的任务全部执行完毕
import time from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor def f1(n,m): time.sleep(1) print(n) return n+m if __name__ == '__main__': t = ThreadPoolExecutor(5) t_lis = [] for i in range(10): ret = t.submit(f1,i,5) t_lis.append(ret) t.shutdown() for i in t_lis: print(i.result()) print('主程序结束')
协程的概念:可以理解为微线程,在遇到io阻塞时,保存当前状态并进行切换,且阻塞时间是并行的. 既节省时间,又提高效率.
import gevent #导入模块
gevent.sleep(1) # 该方法的阻塞时间可以被识别并执行,如果是time.sleep()是不能识别,且不会节省时间的
g1 = gevent.spawn(f1) # 异步提交f1和f2任务
g2 = gevent.spawn(f2) # 异步提交f1和f2任务
gevent.joinall ( [g1,g2] ) # 等待执行完才继续执行 相当于 g1.join() 和 g2.join()
import gevent def f1(): print('1号开启游戏') gevent.sleep(2) print('1号吃鸡了') def f2(): print('2号开启游戏') gevent.sleep(2) print('2号吃鸡了') g1 = gevent.spawn(f1) #异步提交f1任务 g2 = gevent.spawn(f2) #异步提交f2任务 g1.join() g2.join() # gevent.joinall([g1,g2]) print("主程序结束")
线程的简单应用(异步执行函数,不影响主流程)
import thread # 异步的执行函数 thread.start_new_thread(create_transfer_ticket, (transfer.no, g.send_ticket_mail,))