Найти - Пользователи
Полная версия: Не могу разобраться с ресурсами в SimPy
Начало » Python для новичков » Не могу разобраться с ресурсами в SimPy
1
vovane
Для курсача надо смоделировать работу некоей системы обработки документов. Я немножко погуглил, т.к. не хотел изобретать велосипедов, и нашел 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
Разобрался! Нужно было сделать в __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)
Видимо, при объявлении среды, нужно сразу объявлять ресурсы, которые, судя по всему, пропадают при переобъявлении среды.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB