用于异步I/O的mio
库依赖于开发人员提供Token
类型的实例,以便将发生的事件关联回源,例如特定的TcpStream
或Handler::Timeout
。
从实现中可以看到,Token
只是usize
的包装类型。每次需要Token
时,简单地增加计数器是很诱人的,但它最终会溢出。
当我生成Tokens
传递给EventLoop
时,我应该记住什么规则?一些具体问题:
- 如果我有两个线程,每个线程都有自己的
- 我可以使用
Token=0
同时表示TcpStream
和挂起的Timeout
,或者它们都存储在相同的令牌集合中吗? - 从
0
跳到1,000,000
有什么害处吗?(例如,它们是否存储在针对序号进行优化的数据结构中?)
EventLoop
,他们都可以使用Token=0
来监听两个不同流上的事件吗?(即Tokens
是否绑定到特定的EventLoop
实例?)谢谢!
简短的版本:mio
实际上并没有对令牌做任何事情,除了在接收到相应的事件时将它们传回给您,所以就mio
而言,您可以使用任何您想要的令牌。单独回答您的问题:
如果我有两个线程,每个线程都有自己的EventLoop,他们都可以使用Token=0来监听两个不同流上的事件吗?(即token绑定到一个特定的EventLoop实例吗?)
当然可以。
我可以使用Token=0同时表示TcpStream和pending Timeout,或者它们都存储在相同的Token集合中吗?
mio
没有令牌集合。如果您不需要惟一的令牌来标识应用程序代码中的内容,那么您可以在不同的地方使用相同的令牌。(虽然我对这个问题有点困惑,因为据我所知,超时根本不使用mio Token
s)
从0跳到1,000,000有什么害处吗?(例如,它们是否存储在针对序号进行优化的数据结构中?)
。正如我上面所说的,mio并不关心你的令牌的价值。