Как передать случайное событие из дочернего процесса в родительский процесс - PullRequest
0 голосов
/ 15 января 2019

Я программирую симуляцию энергетического рынка, где дома и внешние события влияют на то, как цена на энергию изменяется во времени (каждые х секунд в день и переменные меняются, изменяя цену). У меня есть заключительная часть, к которой мне нужно обратиться, чтобы выполнить мои проектные требования.

У меня есть то, что я называю рыночным процессом, в котором определяется цена энергии, и для определения цены внешние факторы будут влиять на указанную цену. Спецификации заключаются в том, что внешний процесс является дочерним по отношению к процессу рынка (т. Е. Создан в рамках рынка), и что внешний будет сигнализировать случайное событие, и в зависимости от полученного сигнала рынок будет применять различные коэффициенты к цене энергии. Тем не менее, у меня есть некоторые трудности с установлением внешнего взаимодействия с рынком через сигнал. Я сам работаю на Windows, но этот код должен работать и на Linux (в идеальном мире). В настоящее время я использую трубу, и хотя это проще, это не то, что я должен делать ...

def market(number_of_days, number_of_homes, home_queue, home_counter, market_ready, clock_ready, temperature, season, market_connection):
    current_price = starting_price
    average_exchange = 0.0
    exchange = 0.0

    market_conn, external_conn = Pipe()

    e = Process(target = external, args=(number_of_days, external_conn, clock_ready))
    e.start()

    while clock_ready.wait(3 * delay):
        market_ready.value = False
        event = market_conn.recv()
        internal_effect = alpha_1 * (1/temperature[1]) + alpha_3 * average_exchange
        external_effect = event[1] * event[2]

        current_price = gamma * current_price + internal_effect + external_effect
    e.join()
    market_conn.close()
    external_conn.close()

А вот текущий внешний код.

def external(number_of_days, external_connection, clock_ready):
    events = [["Nuclear fusion", 0.4, -0.3],
         ["Civil war", 0.5, 0.2],
         ["Reelection of Trump", 0.3, 0.3],
         ["Biofuel conversion for all vehicles", 0.3, -0.2],
         ["Climate change brings Ice Age", 0.35, 0.33]]

    for i in range(number_of_days):
        event = False
        rand = random.random()

        if rand >= 0.75:
        event = True

        if event:
            external_connection.send(events[random.randint(0, len(events) - 1)])
        else:
            external_connection.send(["None", 0, 0])

Я не очень разбираюсь в использовании сигналов, поэтому все, что я могу сказать о том, что я ожидаю, это то, что External посылает один из двух сигналов в Market, и на основании этого Market случайным образом выбирает событие из списка, который я определяю лично. Я могу обойти последний, когда получу сигнал, но не знаю, как правильно отправить сигнал.

...