生产者消费者 协同程序 python

因为相对于子例程协程可以有多个入口和出口点,可以用协程来实现任何的子例程。正如Knuth所说:“子例程是协程的特例。”因为子例程只返回一次,要返回多个值就要通过集合的形式。这在有些语言,如Forth里很方便;而其他语言,如C,只允许单一的返回值,所以就需要引用一个集合。相反地,因为协程可以返回多次,返回多个值只需要在后继的协程调用中返回附加的值即可。在后继调用中返回附加值的协程常被称为产生器。有些情况下,使用协程的实现策略显得很自然,但是此环境下却不能使用协程。典型的解决方法是创建一个子例程,它用布尔标志的集合以及其他状态变量在调用之间维护内部状态。代码中基于这些状态变量的值的条件语句产生出不同的执行路径及后继的函数调用。另一种典型的解决方案是用一个庞大而复杂的switch语句实现一个显式状态机。这种实现理解和维护起来都很困难。

生成器和普通函数有些区别,比如生成器不用return返回,而用yield来返回一系列元素
除非“召唤”生成器的next(),否则函数体里面不会执行任何代码块,上下文环境保存着。
虽然不需要明确定义__iter__()和next()方法,但是它本身包含这个方法。
当想要结束一个协程时,使用close()方法即可,close会在协程中引发GeneratorExit异常,这时候可以通过try/except捕获。

def consumer():
    try:
        while True:
            food = yield  
            if not food:
                return            
            print 'Consume Food: ', food
            
    except GeneratorExit:
        print '====== over ======'
    finally:
        return 
        

def producer():

    c1 = consumer()
    c1.send( None )
    food = {}
    for count in xrange( 5 ):
        item = chr( count + 65 )
        food[item] = count
        print 'Produce food: ', food
        c1.send( food )
    c1.close()
    return

producer()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生产者消费者问题是一个经典的同步问题,它描述的是有一组生产者和消费者共享同一个有限缓冲区的情况下,如何让它们在不发生竞争条件(如死锁)的情况下协同工作。 在C语言中,我们可以使用线程和信号量来实现生产者消费者问题。 首先,我们需要定义一个缓冲区,用于存储生产生产的物品,以及消费者消费的物品。缓冲区可以使用数组来实现,例如: ```c #define BUFFER_SIZE 10 int buffer[BUFFER_SIZE]; int in = 0; // 指向缓冲区下一个插入位置的指针 int out = 0; // 指向缓冲区下一个删除位置的指针 ``` 接下来,我们需要定义两个线程函数,即生产者和消费者。生产者线程函数的作用是不断地往缓冲区中插入物品,消费者线程函数的作用是不断地从缓冲区中删除物品。它们的实现可以使用while循环和sleep函数来实现,例如: ```c void* producer(void* arg) { int item; while (true) { item = produce_item(); // 生产物品 sem_wait(&empty); // 等待缓冲区有空位 pthread_mutex_lock(&mutex); // 上锁 buffer[in] = item; // 将物品插入缓冲区 in = (in + 1) % BUFFER_SIZE; // 更新插入位置指针 pthread_mutex_unlock(&mutex); // 解锁 sem_post(&full); // 通知缓冲区有物品 sleep(1); } } void* consumer(void* arg) { int item; while (true) { sem_wait(&full); // 等待缓冲区有物品 pthread_mutex_lock(&mutex); // 上锁 item = buffer[out]; // 从缓冲区中取出物品 out = (out + 1) % BUFFER_SIZE; // 更新删除位置指针 pthread_mutex_unlock(&mutex); // 解锁 sem_post(&empty); // 通知缓冲区有空位 consume_item(item); // 消费物品 sleep(1); } } ``` 在上面的代码中,我们使用了pthread_mutex_lock和pthread_mutex_unlock函数来实现互斥锁,旨在保证同一时间只有一个线程能够访问缓冲区。另外,我们还使用了sem_wait和sem_post函数来实现信号量,旨在保证当缓冲区为空或已满时,生产者和消费者能够正确地进行等待和通知。 最后,在main函数中,我们需要初始化信号量和互斥锁,并创建两个线程,即生产者和消费者。代码实现如下: ```c int main() { pthread_t producer_thread, consumer_thread; pthread_mutex_init(&mutex, NULL); sem_init(&empty, 0, BUFFER_SIZE); sem_init(&full, 0, 0); pthread_create(&producer_thread, NULL, producer, NULL); pthread_create(&consumer_thread, NULL, consumer, NULL); pthread_join(producer_thread, NULL); pthread_join(consumer_thread, NULL); pthread_mutex_destroy(&mutex); sem_destroy(&empty); sem_destroy(&full); return 0; } ``` 在上面的代码中,我们使用了pthread_create和pthread_join函数来创建和等待线程的结束。另外,在程序结束时,我们需要销毁信号量和互斥锁。 综上所述,这就是一个简单的生产者消费者问题的C语言实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值