子线程修改全局变量_Python中的Condition条件变量 - Python每日3题(多线程专题)...

本文介绍了Python中多线程的专题知识,包括setDaemon方法的作用,多线程间的通信方式,以及Condition条件变量的使用。强调了全局变量、队列以及Condition对象在多线程同步中的应用。
摘要由CSDN通过智能技术生成

2b4c79b8f470b84137880543c0e90ae3.png

这里是Python7编程挑战-多线程专题!

每天学习3个问题,包括初级,中级,高级问题各1个。

今天是第7天!一起来呀,就7天!

  1. 每日3题是麦叔的面试系列专题之一,每天包括初级,中级,高级难度题目各一道。
  2. 每日3题,100天之后成为大牛!
  3. 如果有不明白的,给麦叔留言。

[Easy] setDaemon方法的作用?

思考30秒再往下翻...

3adb8f8758bd706a416d5839be84745c.png

属性daemon的值默认为False,如果需要修改,必须在调用start()方法启动线程之前进行设置。

如果某个子线程的daemon属性为False,主线程结束时会检测该子线程是否结束,如果该子线程还在运行,则主线程会等待它完成后再退出。

如果某个子线程的daemon属性为True,主线程运行结束时不对这个子线程进行检查而直接退出,同时所有daemon值为True的子线程将随主线程一起结束,而不论是否运行完成。

import threading
import time

def test(name):
    time.sleep(2)
    print(f'starting thread {name}')

t = threading.Thread(target=test, args=('thread-1', ))
t.setDaemon(True)
t.start()
print('done')

[Normal] 多线程之间如何通信?

思考30秒再往下翻...

40d9c94b174e0bb5e88e5006221e4a99.png
  1. 最简单的想法是建立一个全局变量。几个子线程共同操作这个全局变量
  2. 使用 queue 库中的队列
from queue import Queue
from threading import Thread
import time

# A thread that produces data
def producer(out_q):
    data = 'some data'
    print(f'put data => {data}')
    out_q.put(data)

# A thread that consumes data
def consumer(in_q):
    time.sleep(1)
    data = in_q.get()
    print(f'get data <= {data}')

# Create the shared queue and launch both threads
q = Queue()
t1 = Thread(target=consumer, args=(q,))
t2 = Thread(target=producer, args=(q,))
t1.start()
t2.start()

t1.join()
t2.join()

[Hard] 说说Condition条件变量

思考30秒再往下翻...

584d35438666d8ab7ccc717e2da53b37.png

使用 Condition 对象可以在某些事件触发或者达到特定的条件后才处理数据,Condition 除了具有 Lock 对象的 acquire 方法和 release 方法外,还提供了 wait 和 notify 方法。

线程首先 acquire 一个条件变量锁。如果条件不足,则该线程 wait,如果满足就执行线程,甚至可以 notify 其他线程。其他处于 wait 状态的线程接到通知后会重新判断条件。

import threading, time

class Consumer(threading.Thread):
    def __init__(self, cond, name):
        # 初始化
        super(Consumer, self).__init__()
        self.cond = cond
        self.name = name

    def run(self):
        # 确保先运行Seeker中的方法
        time.sleep(1)
        self.cond.acquire()
        print(self.name + ': 我这两件商品一起买,可以便宜点吗')
        self.cond.notify()
        self.cond.wait()
        print(self.name + ': 我已经提交订单了,你修改下价格')
        self.cond.notify()
        self.cond.wait()
        print(self.name + ': 收到,我支付成功了')
        self.cond.notify()
        self.cond.release()
        print(self.name + ': 等待收货')


class Producer(threading.Thread):
    def __init__(self, cond, name):
        super(Producer, self).__init__()
        self.cond = cond
        self.name = name

    def run(self):
        self.cond.acquire()
        # 释放对琐的占用,同时线程挂起在这里,直到被 notify 并重新占有琐。
        self.cond.wait()
        print(self.name + ': 可以的,你提交订单吧')
        self.cond.notify()
        self.cond.wait()
        print(self.name + ': 好了,已经修改了')
        self.cond.notify()
        self.cond.wait()
        print(self.name + ': 嗯,收款成功,马上给你发货')
        self.cond.release()
        print(self.name + ': 发货商品')


cond = threading.Condition()
consumer = Consumer(cond, '买家')
producer = Producer(cond, '卖家')
consumer.start()
producer.start()

运行结果:

买家: 我这两件商品一起买,可以便宜点吗
卖家: 可以的,你提交订单吧
买家: 我已经提交订单了,你修改下价格
卖家: 好了,已经修改了
买家: 收到,我支付成功了
买家: 等待收货
卖家: 嗯,收款成功,马上给你发货
卖家: 发货商品
Python中的Condition条件变量 - Python每日3题(多线程专题)​mp.weixin.qq.com

你可以来这里打卡,分享你的想法。

我是麦叔:教你学编程,陪你走职场的路!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值