我对简单的事件和事情发生的顺序感到困惑。在下面的代码中,发件人进程生成一个事件,并给它一个唯一的序列号。接收进程正在等待此事件,并在接收到时打印序列号。代码的输出是:
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换句话说,对于发送者发送的每一个事件,接收方只被唤醒一次。然而,我不确定这是否完全安全,并将一贯这样工作。例如,在接收方可以看到相同事件两次的情况下,是否可能出现以下顺序?
请你能帮我准确地理解一下这份订单是如何运作的吗?
谢谢。
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)发布于 2022-08-05 17:15:19
不,您不能依赖订单事件会在滴答中发生。通常,如果您想以异步方式执行任务,则需要一个队列。在我的示例中,我使用simpy Stores作为消息队列。请注意,这只是演示了如何进行一些通信,并且可能需要对您要使用的sim协议进行一些更改。
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)https://stackoverflow.com/questions/73246893
复制相似问题