1.定时器
threading.Timer(5,run) 5 是延迟时间 run是函数
实例
"""
定时器
"""
import threading
import time
def run():
print("定时器启动")
print(threading.current_thread())
timer=threading.Timer(5,run)
if __name__ == '__main__':
t1=threading.Timer(5,function=run)
t1.start()
while True:
time.sleep(10)
print('主线程')
2.队列
队列相关知识 queue.Queue()先入先出 queue.PriorityQueue(maxsize=3) Queue.qsize() 返回队列的大小 Queue.empty() 如果队列为空,返回True,反之False Queue.full() 如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应 Queue.get([block[, timeout]])获取队列,timeout等待时间 Queue.get_nowait() 相当于Queue.get(False),非阻塞方法 Queue.put(item) 写入队列,timeout等待时间 Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。 Queue.join() 实际上意味着等到队列为空,再执行别的操作
实例
import queue
#先入后去
import threading
import time
"""
q= queue.Queue(maxsize=3)#先入先出
q.put(1)#入一个队列
q.put(2)
print(q.full())#不满了为错误
q.put(3)
print(q.full())#满了为正确
print(q.get())#出一个队列
print(q.empty())#不空为错
print(q.get())
print(q.get())
print(q.empty())#空为对
# q.put(1,timeout=2)
print(q.qsize())#查看剩余队列
q=queue.PriorityQueue(maxsize=3)
q.put(1,'你好1')
q.put(10,'你好3')
q.put(2,'你好2')
"""
#先出后入
q=queue.Queue(maxsize=10)
def put_in():
count=1
while True:
q.put(f'视频{count}')
print(f'up主录制视频{count}')
count+=1
time.sleep(2)
def get_out(name):
while True:
print(f'{name}霸占了{q.get()}')
time.sleep(2)
if __name__ == '__main__':
p = threading.Thread(target=put_in)
p.start()
g=threading.Thread(target=get_out,args=('华腾',))
g.start()
g1 = threading.Thread(target=get_out, args=('华腾1',))
g1.start()
3.线程池
线程池 功能:提高性能,防止线程多导致运行缓慢,适用突发线程多得 线程池由concurrent.futures下得ThreadPoolEexecutor提供 submit(fn,*args,&&kwargs)将函数fn提交给进程池,后面是参数 map(fn,*iterables,timeout=None,chunksize=1)启动多线程,让函数fn分别使用后面得可迭代参数 shutdown(wait=Ture)关闭线程 使用submit()函数提交后会韩慧==返回一个Future对象 cancel()取消线程,正在运行无法取消,返回Flase,取消成功Ture cancelled()返回线程是否被取消 running()返回线程是否正在运行 done()返回线程是否完成 result(timeout=None)获取该线程得返回结果,会阻塞线程,timeout是阻塞事件 add_done_callback(fn)线程结束执行fn
实例
import threading
import time
from concurrent.futures import ThreadPoolExecutor
def run(x):
print(f'线程{x}')
time.sleep(2)
return x*10
def callback(future):
print(future.result())
if __name__ == '__main__':
#with ThreadPoolExecutor(max_workers=2) as pool: 一样功能不用自己关闭
pool=ThreadPoolExecutor(max_workers=2)#启动线程池运行两个
future1=pool.submit(run,1)
future2=pool.submit(run,2)
future3 = pool.submit(run, 3)#
#查看线程1是否完成
print(future1.done())#线程池结束
time.sleep(3)
print(future2.done())
# h获取线程1返回值
# print(future1.result())#使用会阻塞线程
#h获取线程三返回值
future1.add_done_callback(callback)
# print(future3.result())
future3.add_done_callback(callback)
# pool.shutdown()#关闭后不能使用线程池
print('程序结束')
result=pool.map(run,[7,8,9])
print(result)
for i in result:
print(i)