我的代码有问题。
我正在使用Simpy for Python,并且正在尝试使用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)

08-24 21:37