python之线程相关操作(补充)

时间:2022-11-26 22:00:02

1 线程的其他方法

import threading
import time
from threading import Thread, current_thread def f1(n):
time.sleep(1)
print('子线程名称', current_thread().getName())
print('子线程id', current_thread().ident)
print('%s号线程任务' % n) if __name__ == '__main__':
t1 = Thread(target=f1, args=(1,))
t1.start()
t2 = Thread(target=f1, args=(1,))
t2.start()
print('主线程名称', current_thread().getName())
print('主线程id', current_thread().ident)
print(current_thread()) # 当前线程对象
print(threading.enumerate()) # 当前正在运行的线程对象的一个列表
print(threading.active_count()) # 当前正在运行的线程数量

2 线程队列

首先导入模块 import queue

先进先出队列:queue.Queue(3)

先进后出\后进先出队列:queue.LifoQueue(3)

优先级队列:queue.priorityQueue(3)

其中都是相同的方法

import queue

# # 先进先出队列
# q = queue.Queue(3)
# q.put(1)
# q.put(2)
# print('当前长度', q.qsize())
# print('是否满了', q.full())
# q.put(3)
# print('是否满了', q.full())
# try:
# q.put_nowait(5)
# except Exception:
# print('满了')
# print(q.get())
# print(q.get())
# print('是否空了', q.empty())
# print(q.get())
# print('是否空了', q.empty())
# try:
# print(q.get_nowait())
# except Exception:
# print('空了') # # 先进后出队列, 类似于栈
# q = queue.LifoQueue(3)
# q.put(1)
# q.put(2)
# q.put(3)
#
# print(q.get())
# print(q.get())
# print(q.get())
# '''
#
#
#
# ''' # 优先级队列
q = queue.PriorityQueue(7)
q.put((6, 'today')) # 存放一个元组, 第一个元素是优先级, 越小优先级越高
q.put((-3, 'yesterday'))
q.put((5, 'tomorrow'))
q.put((12, 12))
q.put((5, 'July'))
q.put((7,23))
q.put((7,123)) print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
'''
(-3, 'yesterday')
(5, 'July')
(5, 'tomorrow')
(6, 'today')
(7, 23)
(7, 123)
(12, 12)
'''

3 线程池

首先导入

From concurrent_futures import ThreadPoolExecutor,ProcessPoolExecutor

import time
from threading import current_thread
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor def f1(n,s):
time.sleep(1)
# print('%s号子线程'%current_thread().ident)
# print(n,s)
return if __name__ == '__main__':
tp = ThreadPoolExecutor(4)
# tp = ProcessPoolExecutor(4)
# tp.map(f1,range(10)) #异步提交任务,参数同样是任务名称,可迭代对象
res_list = []
for i in range(10):
res = tp.submit(f1,i,'baobao') #submit是给线程池异步提交任务,
print(res)
# res.result()
res_list.append(res) # for r in res_list:
# print(r.result()) tp.shutdown() #主线程等待所有提交给线程池的任务,全部执行完毕 close + join
for r in res_list:
print(r.result()) # 和get方法一样,如果没有结果,会等待,阻塞程序
print('主线程结束')

线程池回调函数:

from  concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor

def f1(n, n1):
return n + n1
def f2(n):
print(n) # <Future at 0x25bc198 state=finished returned int>
print('这里是回调函数:', n.result()) # 这里是回调函数: 23 if __name__ == '__main__':
tp = ThreadPoolExecutor(4)
res = tp.submit(f1, 11,12).add_done_callback(f2)