Python中send()函数实现线程间的消息传递
发布时间:2023-12-16 09:59:58
Python中的send()函数用于在协程中发送数据,以实现线程间的消息传递。send()函数可以将数据发送给协程的下一个yield表达式,同时将其作为yield表达式的返回值。
以下是一个使用send()函数实现线程间消息传递的简单示例:
import time
import random
import threading
def coroutine():
while True:
value = yield
print("Received:", value)
def producer(coroutine):
for i in range(5):
value = random.randint(1, 10)
print("Produced:", value)
coroutine.send(value)
time.sleep(0.5)
# 创建协程对象
c = coroutine()
# 启动协程
next(c)
# 创建生产者线程
t = threading.Thread(target=producer, args=(c,))
# 启动生产者线程
t.start()
# 等待生产者线程结束
t.join()
在上述示例中,我们首先定义了一个coroutine()函数作为协程对象。在协程函数中使用yield语句来暂停协程的执行,并等待接收数据。然后,我们定义了一个producer()函数作为生产者函数,用于生成随机的数据并发送给协程。
在主线程中,我们首先创建了一个协程对象c,然后启动了协程对象的执行。接下来,我们创建了一个子线程,并将协程对象c作为参数传递给生产者函数。最后,我们启动了生产者线程,并等待其完成。
在生产者函数中,我们使用send()函数将数据发送给协程对象c。send()函数的参数即为要发送的数据。在每次发送数据后,我们通过time.sleep()函数添加了一定的延迟,以便观察协程对象的执行情况。
运行上述示例,你将看到类似下面的输出:
Produced: 8 Received: 8 Produced: 3 Received: 3 Produced: 9 Received: 9 Produced: 1 Received: 1 Produced: 4 Received: 4
从输出结果中可以看到,生产者线程生成了随机的数据,并将其发送给了协程对象。协程对象通过yield暂停了自身的执行,并输出了接收到的数据。随后,协程对象重新被唤醒,继续执行后面的代码,直到下一个yield表达式,然后再次暂停。
通过使用send()函数,我们可以在协程中实现线程间的消息传递,实现更为灵活和高效的并发编程。
