欢迎访问宙启技术站
智能推送

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()函数将数据发送给协程对象csend()函数的参数即为要发送的数据。在每次发送数据后,我们通过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()函数,我们可以在协程中实现线程间的消息传递,实现更为灵活和高效的并发编程。