【问题标题】:Process yields a Process in Python using SimpyProcess 使用 Simpy 在 Python 中生成一个 Process
【发布时间】:2019-11-23 19:57:34
【问题描述】:

我的代码有问题。 我正在使用 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)

【问题讨论】:

    标签: python simpy


    【解决方案1】:

    我解决了这个问题,我的解决方案是什么? 答:我删除了函数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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多