根据cookbook, 多线程情况的事件驱动IO

模拟使用线程池, 事件驱动IO模型, 这里使用的select

1. 采用对socket,初始化完成之后,内核状态是不可读,不可写(无东西可读)

2. 线程池完成工作之后, 回调_complete, 把线程计算结果及回调函数放入pending的list

3. 发送一个字节, 告诉内核select, 返回flieno那个socket可读,执行handle_receive把pending依次处理完成。

应用场景:

接收大量的fd,内存多大接多少

线程池处理结果

回调, fd清理收尾


#!/usr/bin/env python

class EventHandler(object):
    """An I/O event loop
    """

    def fileno(self):
        raise NotImplemented

    def wants_to_receive(self):
        """Return True if receiving is allowed
        """
        return False

    def handle_receive(self):
        """Perform the receive operation
        """
        pass

    def wants_to_send(self):
        """Return True if sending is requested
        """
        return False

    def handle_send(self):
        """send data
        """
        pass


from concurrent.futures import ThreadPoolExecutor
import socket

class ThreadPoolHandler(EventHandler):
	def __init__(self, nworkers=3):
		a = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		a.bind(('127.0.0.1', 0))
		a.listen(1)
		connect_address = a.getsockname()
		self.writer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		self.writer.connect(connect_address)
		self.reader, addr = a.accept()
		a.close()
		self.pending = []
		self.pool = ThreadPoolExecutor(nworkers)

	def fileno(self):
		return self.reader.fileno()

	def _complete(self, callback, r):
		self.pending.append((callback, r.result()))
		self.writer.send(b'x')  # wake

	def run(self, func, args={}, kwargs={}, *, callback):
		r = self.pool.submit(func, *args, **kwargs)
		r.add_done_callback(lambda r: self._complete(callback, r))

	def wants_to_receive(self):
		return True

	def handle_receive(self):
		"""Run callback functions of complete work
		"""
		for callback, result in self.pending:
			callback(result)
			self.reader.recv(1)  # recv x
		self.pending = []


class UDPServer(EventHandler):
    """An UDP io event loop handler
    """

    def __init__(self, address):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.bind(address)
    
    def fileno(self):
        return self.sock.fileno()

    def wants_to_receive(self):
        # blocking
        return True
     

import select 
def event_loop(handlers):
    while True:
        wants_recv = [h for h in handlers if h.wants_to_receive()]
        wants_send = [h for h in handlers if h.wants_to_send()]
        can_recv, can_send, err = select.select(wants_recv, wants_send, [])
        for h in can_recv:
            h.handle_receive()
        for h in can_send:
            h.handle_send()

def fib(n):
	if n < 2:
		return 1
	else:
		return fib(n-1) + fib(n-2)

class UDPFibServer(UDPServer):
	def handle_receive(self):
		msg, addr = self.sock.recvfrom(1024)
		n = int(msg)
		pool.run(fib, (n,), callback=lambda r: self.respond(r, addr))
	def respond(self, result, addr):
		self.sock.sendto(str(result).encode("ascii"), addr)


if __name__ == "__main__":
	pool = ThreadPoolHandler(16)
	handlers = [pool, UDPFibServer(('', 7777))]
	event_loop(handlers)







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UVM是一种在硬件验证领域广泛应用的验证方法学,它提供了一套强大且灵活的工具和方法,用于设计和验证复杂的芯片和集成电路。 UVM的核心是基于SystemVerilog的验证类库,它提供了一种基于对象的方法,用于构建可重用的、灵活的、可扩展的验证环境。通过定义和实例化验证组件、环境和代理等抽象层次,UVM使得开发人员能够快速、高效地设计和验证复杂的芯片功能。 在UVM中,Cookbook(烹饪书)是一种常用的参考手册,用于解决验证环境设计和实现中的常见问题。它提供了各种验证组件、事务、配置、约束以及通信机制等的实例和示例代码。开发人员可以根据自己的需求,从Cookbook中选择和定制适合自己项目的验证解决方案。 UVM Cookbook包含了各种验证环境和组件的设计方法、最佳实践和代码示例。它提供了从简单到复杂的各种场景,涵盖了基本的功能验证、高级功能验证、性能验证、断言验证等多个方面。开发人员可以通过参考Cookbook来加速验证环境的构建和验证任务的完成。 使用UVM Cookbook的好处是显而易见的。首先,它提供了验证设计的参考模板,开发人员可以直接基于这些模板进行开发,节省了设计和验证的时间和精力。其次,Cookbook提供了大量的经验和技巧,可以帮助开发人员避免常见的错误和陷阱。最后,通过Cookbook,开发人员可以学习到其他验证工程师的实践经验,有助于不断提升自己的验证技能。 总而言之,UVM Cookbook是一本对于UVM验证方法学有兴趣的开发人员来说非常有用的参考手册。它提供了验证环境设计和实现的各种示例和技巧,帮助开发人员提高开发效率和验证质量,从而加速芯片设计和上市时间。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值