Я создал простую среду моделирования с одним генератором и двумя потребителями, используя библиотеку simpy
python
.Генератор генерирует запросы со случайной скоростью, а также другое случайное число.Это случайное число передается первому потребителю , который использует это число в качестве времени обработки.То же случайное число передается от первого потребителя второму потребителю 1006 *, который снова использует его в качестве времени обработки.Код для этой реализации (упомянутый ниже) кажется неосуществимым, когда есть больше потребителей , так как мне придется добавить больше consumer_()
методов.Я хочу, чтобы можно было смоделировать ту же настройку более возможным способом.Приветствуются некоторые рекомендации о том, как выполнить эту задачу.Спасибо!
import pandas
import simpy
import numpy as np
import scipy.stats as st
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import random
RANDOM_SEED = 42
NEW_REQUEST = 100
s1_totalQueueLength = 0
s1_sumWaitingTime = 0.0
s2_totalQueueLength = 0
s2_sumWaitingTime = 0.0
def generator(env, number, s1_counter, s2_counter):
for i in range(number):
r = random.expovariate(75.00)
s1 = server_one(env, i, s1_counter, s2_counter, r)
env.process(s1)
t = random.expovariate(15)
yield env.timeout(t)
def consumer_1(env, i, s1_counter, s2_counter, s3_counter, r):
global s1_totalQueueLength
global s1_sumWaitingTime
global arrivalTime
arrive = env.now
arrivalTime = arrive
with s1_counter.request() as req:
results = yield req
wait = env.now - arrive
yield env.timeout(r)
s2 = consumer_2(env, i, s2_counter, s3_counter, tib)
env.process(s2)
s1_totalQueueLength = s1_totalQueueLength + len(s1_counter.queue)
s1_sumWaitingTime = s1_sumWaitingTime + wait
if i > 0:
print("Server 1: average queue length = " + str(s1_totalQueueLength/i) + " average waiting time = " + str(s1_sumWaitingTime/i))
file1.write(str(wait) + "\n")
def consumer_2(env, i, s2_counter, s3_counter, tib):
global s2_totalQueueLength
global s2_sumWaitingTime
print("S2 received " + str(tib)+" from Server One")
arrive = env.now
with s2_counter.request() as req:
results = yield req
wait = env.now - arrive
yield env.timeout(tib)
s2_totalQueueLength = s2_totalQueueLength + len(s2_counter.queue)
s2_sumWaitingTime = s2_sumWaitingTime + wait
if i > 0:
print("Server 2: average queue length = " + str(s2_totalQueueLength / i) + " average waiting time = " + str(
s2_sumWaitingTime / i))
file2.write(str(wait)) + "\n")
random.seed(RANDOM_SEED)
env = simpy.Environment()
file1 = open("c1.csv", "w")
file1.write("Waiting_time" + "\n")
file2 = open("c2.csv", "w")
file2.write("Waiting_time" + "\n")
# Start processes and run
s1_counter = simpy.Resource(env, capacity=1)
s2_counter = simpy.Resource(env, capacity=1)
env.process(generator(env, NEW_REQUEST, s1_counter, s2_counter))
env.run()