线程锁
# 线程锁的代价是,失去异步效果
# db.txt文件内容:{"count": 1}
from threading import Thread,Lock
import time
import json
def search():
time.sleep(1)
f = open('db.txt', 'r', encoding='utf-8')
ticket =json.load(f)
print(f"剩余票数:{ticket['count']}")
f.close()
return ticket
def buy():
ticket = search()
if ticket['count'] > 0:
ticket['count'] -=1
print('购买完成')
f = open('db.txt', 'w')
f.write(json.dumps(ticket))
def task(lock):
lock.acquire() # 上锁
buy()
lock.release() #解锁
if __name__ == '__main__':
lock = Lock()
for i in range(3):
t = Thread(target=task,args=(lock,)) # 创建三个线程,每个线程都加锁,表示该线程完成后才能执行下个进程
t.start()
线程池
from multiprocessing.dummy import Pool
import time
def get_urls(url):
time.sleep(2)
print("这是一个线程",url)
if __name__ == '__main__':
start = time.time()
pool = Pool(5) # 创建线程池为5的对象,表示每次最多列表5个线程,交替使用
start = time.time()
list = ['www.1.com','www.2.com','www.3.com','www.4.com','www.5.com','www.6.com']
# get_urls任务只能有一个参数,将list的每个元素传给get_urls
# map已含有join处理,不需要join就可以实现先完成线程,再完成进程
pool.map(get_urls,list)
pool.close()
# 一次只能使用5个线程,所以当有6个任务时,
# 只能等前面的任务结束后释放线程可以执行下个线程,因此总耗时多了2秒
print('总耗时:',time.time()-start)
返回结果:
这是一个线程 www.3.com
这是一个线程 www.2.com
这是一个线程 www.4.com
这是一个线程 www.5.com
这是一个线程 www.1.com
这是一个线程 www.6.com
总耗时: 4.017950057983398