|
发表于 2020-9-27 09:24:17
|
显示全部楼层
本楼为最佳答案
本帖最后由 suchocolate 于 2020-9-27 09:26 编辑
两种方式:全局变量和队列。(以下代码抄自明日科技《python从入门到项目实践》)
1.全局变量+互斥锁:
- from threading import Thread,Lock
- import time
- n=100 # 共100张票
- def task():
- global n
- mutex.acquire() # 上锁
- temp=n # 赋值给临时变量
- time.sleep(0.1) # 休眠0.1秒
- n=temp-1 # 数量减1
- print('购买成功,剩余%d张电影票'%n)
- mutex.release() # 释放锁
- if __name__ == '__main__':
- mutex=Lock() # 实例化Lock类
- t_l=[] # 初始化一个列表
- for i in range(10):
- t=Thread(target=task) # 实例化线程类
- t_l.append(t) # 将线程实例存入列表中
- t.start() # 创建线程
- for t in t_l:
- t.join() # 等待子线程结束
复制代码 2.队列:
- from queue import Queue
- import random,threading,time
- # 生产者类
- class Producer(threading.Thread):
- def __init__(self, name,queue):
- threading.Thread.__init__(self, name=name)
- self.data=queue
- def run(self):
- for i in range(5):
- print("生成者%s将产品%d加入队列!" % (self.getName(), i))
- self.data.put(i)
- time.sleep(random.random())
- print("生成者%s完成!" % self.getName())
- # 消费者类
- class Consumer(threading.Thread):
- def __init__(self,name,queue):
- threading.Thread.__init__(self,name=name)
- self.data=queue
- def run(self):
- for i in range(5):
- val = self.data.get()
- print("消费者%s将产品%d从队列中取出!" % (self.getName(),val))
- time.sleep(random.random())
- print("消费者%s完成!" % self.getName())
- if __name__ == '__main__':
- print('-----主线程开始-----')
- queue = Queue() # 实例化队列
- producer = Producer('Producer',queue) # 实例化线程Producer,并传入队列作为参数
- consumer = Consumer('Consumer',queue) # 实例化线程Consumer,并传入队列作为参数
- producer.start() # 启动线程Producer
- consumer.start() # 启动线程Consumer
- producer.join() # 等待线程Producer结束
- consumer.join() # 等待线程Consumer结束
- print('-----主线程结束-----')
复制代码
|
|