生产者与消费者模型、线程与socket编程

生产者与消费者模型、线程与socket编程

生产者与消费者模型

生产者:生产数据的线程 
消费者:使用、处理数据的线程
缓冲区:隔离生产者和消费者,这样可以避免互相等待,提高运行效率。
生产者快于消费者:缓冲区爆满 撑死
消费者快于生产者:缓冲区一直空 饿死

线程与socket编程

由于TCP是面向连接的协议,需要一对一通信,需要为每个客户端进行服务,之前是为每客户端创建一个进程来服务,但创建进程耗费的资源比较大,而较于进程,线程而适合为每个客户端服务。

随着客户端的连接和退出,服务端需要频繁的创建、销毁线程,这比较耗费时间,如何解决?

信号量:
信号量是一个计数量,与进程间通信使用的信号量原理一样,用于控制访问有限的共享资源。

sem_t
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:初始化信号量
pshared:
    一般取0,表示进程内,多个线程之间共享使用。
    非0,该信号量以共享内存方式,让多个进程使用,但Linux系统不支持。
value:信号量的初始化,代表资源个数。

int sem_wait(sem_t *sem);
功能:对信号量减1操作,如果不能减则阻塞

int sem_trywait(sem_t *sem);
功能:对信号量尝试减1操作,如果不能减则返回错误。

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
功能:对信号量减1操作,如果不能减阻塞abs_timeout时间,超时则返回错误。

int sem_post(sem_t *sem);
功能:对信号量进行加1操作

int sem_destroy(sem_t *sem);
功能:销毁信号量
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多线程生产者消费者问题是一个经典的并发编程问题,主要涉及到线程间的同步和互斥。在这个问题中,有一个生产者线程和一个消费者线程,它们共享一个缓冲区。生产者线程负责往缓冲区中生产数据,而消费者线程则负责从缓冲区中消费数据。为了保证线程安全,需要使用锁或信号量等机制来实现线程间的同步和互斥。 下面是一个简单的多线程生产者消费者的示例代码: ```python import threading import time # 缓冲区大小 BUFFER_SIZE = 10 # 生产者线程 class ProducerThread(threading.Thread): def __init__(self, buffer): threading.Thread.__init__(self) self.buffer = buffer def run(self): for i in range(20): # 生产数据 data = "data-%d" % i # 加锁 self.buffer.lock.acquire() # 如果缓冲区已满,等待消费者消费数据 while len(self.buffer.data) == BUFFER_SIZE: self.buffer.full.wait() # 将数据放入缓冲区 self.buffer.data.append(data) print("ProducerThread: produce %s" % data) # 释放锁 self.buffer.lock.release() # 通知消费者可以消费数据了 self.buffer.empty.notify() # 消费者线程 class ConsumerThread(threading.Thread): def __init__(self, buffer): threading.Thread.__init__(self) self.buffer = buffer def run(self): for i in range(20): # 加锁 self.buffer.lock.acquire() # 如果缓冲区为空,等待生产者生产数据 while len(self.buffer.data) == 0: self.buffer.empty.wait() # 从缓冲区中取出数据 data = self.buffer.data.pop(0) print("ConsumerThread: consume %s" % data) # 释放锁 self.buffer.lock.release() # 通知生产者可以生产数据了 self.buffer.full.notify() # 缓冲区 class Buffer: def __init__(self): self.data = [] self.lock = threading.Lock() self.full = threading.Condition(self.lock) self.empty = threading.Condition(self.lock) if __name__ == "__main__": buffer = Buffer() producer_thread = ProducerThread(buffer) consumer_thread = ConsumerThread(buffer) producer_thread.start() consumer_thread.start() producer_thread.join() consumer_thread.join() ``` 在上面的代码中,我们使用了一个列表来作为缓冲区,使用了 threading.Lock 来实现线程间的互斥,使用了 threading.Condition 来实现线程间的同步。具体来说,我们使用了 full 条件变量来表示缓冲区已满,empty 条件变量来表示缓冲区为空。当生产者线程往缓冲区中生产数据时,如果缓冲区已满,则调用 full.wait() 来等待消费者线程消费数据;当消费者线程从缓冲区中消费数据时,如果缓冲区为空,则调用 empty.wait() 来等待生产者线程生产数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值