这里是Python7编程挑战-多线程专题!
每天学习3个问题,包括初级,中级,高级问题各1个。
今天是第7天!一起来呀,就7天!
- 每日3题是麦叔的面试系列专题之一,每天包括初级,中级,高级难度题目各一道。
- 每日3题,100天之后成为大牛!
- 如果有不明白的,给麦叔留言。
[Easy] setDaemon方法的作用?
思考30秒再往下翻...
属性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秒再往下翻...
- 最简单的想法是建立一个全局变量。几个子线程共同操作这个全局变量
- 使用 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秒再往下翻...
使用 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()
运行结果:
买家: 我这两件商品一起买,可以便宜点吗
卖家: 可以的,你提交订单吧
买家: 我已经提交订单了,你修改下价格
卖家: 好了,已经修改了
买家: 收到,我支付成功了
买家: 等待收货
卖家: 嗯,收款成功,马上给你发货
卖家: 发货商品
你可以来这里打卡,分享你的想法。
我是麦叔:教你学编程,陪你走职场的路!