Форум сайта python.su
0
Для курсача надо смоделировать работу некоей системы обработки документов. Я немножко погуглил, т.к. не хотел изобретать велосипедов, и нашел SimPy. Читал доки, курил примеры, написал даже что-то. Но из этого всего почему-то срабатывает только генератор документов. Пожалуйста, помогите разобраться, что ж я не так делаю с ресурсами. Суть в том, что почему-то не срабатывает вот это:
with Auto_Processor.request() as req: # print("asking for autoprocessing") yield req
# -*- coding: utf-8 -*- import simpy, random doc_count = 0 doc_count_total = 0 manual_count = 0 manual_count_total = 0 avg_time = [0,0] avg_time_total = [0,0] run_count = 0 run_total = 10 enviro = simpy.Environment() #объявляем окружение Auto_Processor = simpy.Resource(enviro,capacity=1); Manual_Processor = simpy.Resource(enviro,capacity=1); # print Auto_Processor # print Manual_Processor def Doc_Generator(env): while True: t = random.expovariate(1.0/10.0) # print("Creating document at %d with t=%d"%(env.now,t)) env.process(Document(env)) yield env.timeout(t) def Document(env): # t = random.expovariate(10) # yield env.timeout(t) global doc_count, doc_count_total doc_count+=1 doc_count_total+=1 queue_time = [0,0] queue_time[0] = env.now t = random.uniform(1.0/6.0,1.0/3.0) yield env.timeout(t) # print("Creating document at %d with t=%f"%(env.now,t)) with Auto_Processor.request() as req: yield req print("autoprocess") avg_time[0]+=env.now-queue_time[0] avg_time_total[0]+=env.now-queue_time_total[0] process_time = random.uniform(2,10) yield env.timeout(process_time) #после чего проверить 5% и встать ко второму if random.random()<=0.05: queue_time[1] = env.now with Manual_Processor.request() as mreq: yield mreq print("Ruchnaya obrabotka") avg_time[1]+=env.now-queue_time[1] avg_time_total[1]+=env.now-queue_time[1] process_time = random.uniform(20,60) yield env.timeout(process_time) def __main__(): for i in range(run_total): global doc_count, doc_count_total, manual_count, manual_count_total, avg_time, avg_time_total, enviro doc_count = manual_count = manual_count_total = 0 avg_time = [0,0] documents = [] enviro = simpy.Environment() #объявляем окружение enviro.process(Doc_Generator(enviro)) enviro.run(until = 60*24*3) avg_time[0]/=doc_count # avg_time[1]/=manual_count print("Experiment #: %d"%i); print("Vsego dokumentov: %d"%doc_count) print("Iz nih obrabotano vruchnuyu: %d"%manual_count) print("Srednee vremya ozhidaniya avtoobrabotki: %f"%avg_time[0]) print("Srednee vremya ozhidaniya ruchnoi obrabotki: %f"%avg_time[1]) print("=================================") doc_count_total/=run_total print("Dokumentov v srednem: %d"%doc_count_total) __main__()
Отредактировано vovane (Янв. 17, 2014 03:27:22)
Офлайн
0
Разобрался! Нужно было сделать в __main__ вот так:
def __main__(): for i in range(run_total): global doc_count, doc_count_total, manual_count, manual_count_total, avg_time, avg_time_total, enviro, Auto_Processor, Manual_Processor doc_count = manual_count = manual_count_total = 0 avg_time = [0,0] enviro = simpy.Environment() #объявляем окружение Auto_Processor = simpy.Resource(enviro,capacity=1); Manual_Processor = simpy.Resource(enviro,capacity=1); enviro.process(Doc_Generator(enviro)) enviro.run(until = 60*24*3) avg_time[0]/=doc_count if manual_count>0: avg_time[1]/=manual_count print("Experiment #: %d"%i); print("Vsego dokumentov: %d"%doc_count) print("Iz nih obrabotano vruchnuyu: %d"%manual_count) print("Srednee vremya ozhidaniya avtoobrabotki: %f"%avg_time[0]) print("Srednee vremya ozhidaniya ruchnoi obrabotki: %f"%avg_time[1]) print("=================================") doc_count_total/=run_total print("Dokumentov v srednem: %d"%doc_count_total)
Офлайн