Process 在 Python 中使用 Simpy 产生一个 Process
Process yields a Process in Python using Simpy
我的代码有问题。
我正在为 Python 使用 Simpy,我正在尝试使用 Simpy 制作 P2P 模拟器。
下面是我的同行生成器的代码,不知道为什么,我从来没有进入函数generate()
。控制台不显示 print('I am here')
.
有人知道我的代码哪里做错了吗?对不起,如果我做错了什么。
import simpy
import random
# PARAMETERS
RANDOM_SEED = 93817
N_NODES = 10 # 2000
RUN_TIME = 10 # 86400 # 24 hours
TIME_TO_GENERATE = 3 # at each 3 seconds
# FUNCTIONS
def peer(env, N_PEER):
print('Peer %d join at %d' % (N_PEER, env.now))
def chanceToGenerate():
value = random.random()*100
if value < 50:
return False
else:
return True
def generate(env, N_PEER):
print('I am here')
chance = chanceToGenerate()
if chance:
yield env.process(peer(env, N_PEER))
return True
else:
return False
def peerGenerator(env):
N_PEER = 0
while True:
if N_PEER < N_NODES:
generated = generate(env, N_PEER)
if generated:
N_PEER += 1
print('time: %d' % env.now)
yield env.timeout(TIME_TO_GENERATE)
# RUNNING
random.seed(RANDOM_SEED)
env = simpy.Environment()
env.process(peerGenerator(env))
env.run(until=RUN_TIME)
我解决了这个问题,我的解决方案是什么?
答:我删除了函数 generate()
并将 yield env.process(peer(env, N_PEER))
移到了函数 generator()
.
我为什么这么做?
我一直在阅读 Simpy 的文档,我发现我不能让一个非进程产生另一个进程。所以只有 peerGenerator() 函数可以产生另一个进程。
代码:
import simpy
import random
# PARAMETERS
RANDOM_SEED = 93817
N_NODES = 10 # 2000
RUN_TIME = 10 # 86400 # 24 hours
TIME_TO_GENERATE = 3 # at each 3 seconds
# FUNCTIONS
class peerGenerator:
def __init__(self, env):
self.env = env
self.generator_proc = env.process(self.generator(env))
def peer(self, env, N_PEER):
print('Peer %d join at %d' % (N_PEER, env.now))
yield env.timeout(0)
def chanceToGenerate(self):
value = random.randint(0,100)
if value < 50:
print('Tried to create a peer')
return False
else:
return True
def generator(self, env):
N_PEER = 0
while True:
if N_PEER < N_NODES:
chance = self.chanceToGenerate()
if chance:
yield env.process(self.peer(env, N_PEER))
N_PEER += 1
print('time: %d' % env.now)
yield env.timeout(TIME_TO_GENERATE)
# RUNNING
env = simpy.Environment()
bootstrap = peerGenerator(env)
env.run(until=RUN_TIME)
我的代码有问题。 我正在为 Python 使用 Simpy,我正在尝试使用 Simpy 制作 P2P 模拟器。
下面是我的同行生成器的代码,不知道为什么,我从来没有进入函数generate()
。控制台不显示 print('I am here')
.
有人知道我的代码哪里做错了吗?对不起,如果我做错了什么。
import simpy
import random
# PARAMETERS
RANDOM_SEED = 93817
N_NODES = 10 # 2000
RUN_TIME = 10 # 86400 # 24 hours
TIME_TO_GENERATE = 3 # at each 3 seconds
# FUNCTIONS
def peer(env, N_PEER):
print('Peer %d join at %d' % (N_PEER, env.now))
def chanceToGenerate():
value = random.random()*100
if value < 50:
return False
else:
return True
def generate(env, N_PEER):
print('I am here')
chance = chanceToGenerate()
if chance:
yield env.process(peer(env, N_PEER))
return True
else:
return False
def peerGenerator(env):
N_PEER = 0
while True:
if N_PEER < N_NODES:
generated = generate(env, N_PEER)
if generated:
N_PEER += 1
print('time: %d' % env.now)
yield env.timeout(TIME_TO_GENERATE)
# RUNNING
random.seed(RANDOM_SEED)
env = simpy.Environment()
env.process(peerGenerator(env))
env.run(until=RUN_TIME)
我解决了这个问题,我的解决方案是什么?
答:我删除了函数 generate()
并将 yield env.process(peer(env, N_PEER))
移到了函数 generator()
.
我为什么这么做? 我一直在阅读 Simpy 的文档,我发现我不能让一个非进程产生另一个进程。所以只有 peerGenerator() 函数可以产生另一个进程。
代码:
import simpy
import random
# PARAMETERS
RANDOM_SEED = 93817
N_NODES = 10 # 2000
RUN_TIME = 10 # 86400 # 24 hours
TIME_TO_GENERATE = 3 # at each 3 seconds
# FUNCTIONS
class peerGenerator:
def __init__(self, env):
self.env = env
self.generator_proc = env.process(self.generator(env))
def peer(self, env, N_PEER):
print('Peer %d join at %d' % (N_PEER, env.now))
yield env.timeout(0)
def chanceToGenerate(self):
value = random.randint(0,100)
if value < 50:
print('Tried to create a peer')
return False
else:
return True
def generator(self, env):
N_PEER = 0
while True:
if N_PEER < N_NODES:
chance = self.chanceToGenerate()
if chance:
yield env.process(self.peer(env, N_PEER))
N_PEER += 1
print('time: %d' % env.now)
yield env.timeout(TIME_TO_GENERATE)
# RUNNING
env = simpy.Environment()
bootstrap = peerGenerator(env)
env.run(until=RUN_TIME)