定时器:
import threading
def run():
print("定时器启动了")
t2 = threading.Timer(5, run) # run函数运行五秒后再次运行run,类似于闹钟
t2.start()
if __name__ == '__main__':
t1 = threading.Timer(5, run) # 程序运行五秒后启动函数run
t1.start()
使用定时器实现当前时间每秒打印一次
import threading
import time
def run():
print(time.strftime('%Y-%m-%d %X'))
t2 = threading.Timer(1, run) # run函数运行五秒后再次运行run
t2.start()
if __name__ == '__main__':
t1 = threading.Timer(1, run) # 主程序执行1秒后开始执行run函数
t1.start()
队列:可以使用队列来实现线程间的同步
生产者消费者模式:
生产者模块儿负责产生数据,放入缓冲区,这些数据由另一个消费者模块儿来从缓冲区取出并进行消费者相应的处理。该模式的优点在于:
a 解耦:缓冲区的存在可以让生产者和消费者降低互相之间的依赖性,一个模块儿代码变化,不会直接影响另一个模块儿
b 并发:由于缓冲区,生产者和消费者不是直接调用,而是两个独立的并发主体,生产者产生数据之后把它放入缓冲区,就继续生产数据,不依赖消费者的处理速度
from multiprocessing import Process, JoinableQueue
import time
import random
def produce(q):
for i in range(3):
time.sleep(random.randint(0,3))
res = '面包师卖了面包%s' % i
print(res)
q.put(f'包子{i}')
def consume(q):
while True:
res = q.get()
if res == None: break
time.sleep(random.randint(0,3))
print('顾客买了%s'%res)
q.task_done()
if __name__ == '__main__':
q = JoinableQueue()
p = Process(target=produce, args=(q,))
c = Process(target=consume, args=(q,))
p.daemon = True
c.daemon = True
p.start()
c.start()
#保证生产者生产完,不然若队列中的数据为0就会跳过q的阻塞
p.join()
q.join()
print('主')
线程池
线程池基本原理: 把任务放进队列中去,然后开N个线程,每个线程都去队列中取一个任务,执行完了之后告诉系统说我执行完了,然后接着去队列中取下一个任务,直至队列中所有任务取空,退出线程。
一个简单的实现例子
import time
import threadpool
#执行比较耗时的函数,需要开启多线程
def myfun(L):
time.sleep(5)
print(L[0])
print(L[1])
return
#使用多线程执行myfun函数
pool = threadpool.ThreadPool(3)
requests = threadpool.makeRequests(myfun, [[1,2],[3,4],[5,6]])
[pool.putRequest(req) for req in requests]
pool.wait()
print ("hello")