vcbeaut 发表于 2020-9-22 15:12:43

python线程锁怎么用?

线程同步的方式有很多,哪种比较常用?

suchocolate 发表于 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('-----主线程结束-----')




页: [1]
查看完整版本: python线程锁怎么用?