首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Simpy事件排序

Simpy事件排序
EN

Stack Overflow用户
提问于 2022-08-05 08:34:28
回答 1查看 82关注 0票数 0

我对简单的事件和事情发生的顺序感到困惑。在下面的代码中,发件人进程生成一个事件,并给它一个唯一的序列号。接收进程正在等待此事件,并在接收到时打印序列号。代码的输出是:

代码语言:javascript
复制
Sender sent req at time 0 with num 0
Receiver Received req at time 0 with num 0
Sender sent req at time 1 with num 1
Receiver Received req at time 1 with num 1
Sender sent req at time 2 with num 2
Receiver Received req at time 2 with num 2
Sender sent req at time 3 with num 3
Receiver Received req at time 3 with num 3
Sender sent req at time 4 with num 4
Receiver Received req at time 4 with num 4

换句话说,对于发送者发送的每一个事件,接收方只被唤醒一次。然而,我不确定这是否完全安全,并将一贯这样工作。例如,在接收方可以看到相同事件两次的情况下,是否可能出现以下顺序?

  1. 发送者在t0生成一个事件。接收者在t0接收到事件。
  2. 发送者和接收者睡眠1次。接收者
  3. 是第一个醒来的进程。它执行它的收益语句,并发现在triggered.
  4. The上生成的事件仍然是t0发送者,在t0上清除事件集并生成一个新的事件。

请你能帮我准确地理解一下这份订单是如何运作的吗?

谢谢。

代码语言:javascript
复制
import simpy

class Test:

    def __init__(self, env):
        self.env = env
        self.req = env.event()
        self.ack = env.event()

        self.env.process(self.sender())
        self.env.process(self.receiver())

    def sender(self):

        num = 0

        while True:
            self.req.succeed(num)
            print('Sender sent req at time %d with num %s' % (self.env.now, num))

            # Assert req for 1 cycle
            yield self.env.timeout(1)
            self.req = self.env.event()

            num += 1

    def receiver(self):

        while True:

            val = yield self.req
            print('Receiver Received req at time %d with num %s' % (self.env.now, val))
            yield self.env.timeout(1)

env = simpy.Environment()

test = Test(env)

env.run(until=25)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-05 17:15:19

不,您不能依赖订单事件会在滴答中发生。通常,如果您想以异步方式执行任务,则需要一个队列。在我的示例中,我使用simpy Stores作为消息队列。请注意,这只是演示了如何进行一些通信,并且可能需要对您要使用的sim协议进行一些更改。

代码语言:javascript
复制
import simpy

class Test:

    def __init__(self, env):
        self.env = env
        self.req = simpy.Store(env)
        self.ack = simpy.Store(env)

        self.env.process(self.sender())
        self.env.process(self.receiver())

    def sender(self):

        num = 0

        while True:

            
            req = self.env.event()
            self.req.put(req)

            print('Sender sent req at time %d with num %s' % (self.env.now, num))

            # take some time to send req
            yield self.env.timeout(1)
            req.succeed(num)

            # wait for ack
            ack = yield self.ack.get()
            print('Sender got ack at time %d' % (self.env.now))
            val = yield ack
            print('Sender ack triggered at time %d with num %s' % (self.env.now, val))

            num += 1

    def receiver(self):

        while True:

            req = yield self.req.get()
            print('Receiver Received req at time %d' % (self.env.now))
            val = yield req
            print('Receiver req triggered at time %d with num %s' % (self.env.now, val))

            ack = self.env.event()
            self.ack.put(ack)
            
            # take some time to send ack
            yield self.env.timeout(1)

            ack.succeed(val)
            print('Receiver finished sending ack at time %d with num %s' % (self.env.now, val))




env = simpy.Environment()

test = Test(env)

env.run(until=25)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73246893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档