Simpy 3: Resources.Resource.request()/.release() WITHOUT with...as:

2024-04-26 12:45:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图将SimPy仿真添加到我正在工作的项目中,但是我对版本3的发布/请求有一些困惑。在

我可以使用'with''块来实现资源,但是在我的情况下,我希望不使用'with''块来请求/释放资源。在

但是,我找不到一个使用simpy3的例子。我阅读了有关资源的文档/源代码,但仍然不能完全正确地理解它。有人能解释一下如何正确地:

...
Request a Resource with the method: 'request()'
...
Release that Resource with the method: 'release()'
...

谢谢,很抱歉打扰你。在

PS:我打算用资源.资源在


Tags: the项目文档版本源代码requestwith情况
3条回答

在对象上使用with在进入with块时调用__enter__,离开时调用__exit__。所以当你这么做的时候

res = resource.Resource()
with res.request() as req:
  # stuff

您实际上是在请求对象上调用__enter__,执行#stuff,然后调用__exit__

^{pr2}$

因此,with块相当于:

res = resource.Resource(...)
req = res.request()
#stuff
if not req.triggered:
   res.put_queue.remove(req)
   res.release(req)

但是,with块还确保无论在#stuff期间抛出什么异常,都会调用清除代码。你会因为上面的代码而失去它。在

如果您想使用没有with块的资源(而且您知道不会被中断),那么只需:

req = resource.request()
yield req
# do stuff
resource.release(req)

这一切都在PEP343中概述

with EXPR as VAR:
        BLOCK

变成:

^{pr2}$

这正是python使用with... as...块的方式,但我想您不想使用这些块是有原因的。如果是这样,那么您只需要__enter__和{}函数。我的想法是,__enter__设置所有内容,__exit__执行所有清理。在

相关问题 更多 >