如何在Simpy中暂停超时进程?

2024-06-01 20:48:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图模拟一个制造工厂,其中鼓首先连接到一台有5个插槽的机器(建模为商店,因为每个插槽具有不同的属性),然后进入第二台有两个插槽的机器(建模为资源,因为插槽之间没有差异)

代码如下:

class Facility(object):

    """
    Each facility has a single classifier which splits a given RMI drum into multiple PFI drums
    based at a rate on their sizes and the site
    """

    def __init__(self, env, site):
        self.env = env
        self.site = "Shenzhen"
        self.name = "Facility"
        self.rate_hr = 3420 #lb/hr

        ## general inventory data
        self.num_pfi_drums = 6
        self.pfi_directory = dict.fromkeys(range(1,self.num_pfi_drums+1),0)
        self.num_pfi_machines = 2

        ## pfi drum capacity data
        self.pfi_capacity = 9500

        ## setting up machines of the facility
        self.classifiers = simpy.Store(env, capacity=5)
        self.pfi_machines = simpy.Resource(env, self.num_pfi_machines)

        ## availableSlot event, must initially be successful
        self.availableSlot = env.event() 
        self.availableSlot.succeed()

    def getSizeSplits(self, num_jb, color):

        ## reads data from csv file
        ## does a bit of formatting
        size_rates = [6.84,16.53,7.41,10.83,15.39]

        return size_rates

    def issueDrum(self):

        ## wait for available slot 
        yield self.availableSlot
        self.availableSlot = self.env.event()

        ## parse directory to get ``drumNumber`` for the next free drum
        freeDrum = None;
        for k, v in self.pfi_directory.items():
            if(v==0):
                freeDrum = k
                break

        if (freeDrum != None):
            self.pfi_directory[freeDrum] = 1

        return freeDrum

    def fillClassification(self, time):
        yield env.timeout(time)

    def prefinish(self, drumNumber):
        yield env.timeout(10000)

    def run(self, num_jb, color):

        ## get the size rates
        size_rates = np.array(self.getSizeSplits(num_jb, color))

        ## calculate size times
        size_times = self.pfi_capacity/size_rates
        size_times = np.ceil(size_times)

        for i in range(5):
            self.classifiers.put({'id': 'S'+str(i+1), 'rate': size_rates[i]})              

        while (True):           
            freeDrum = yield self.env.process(self.issueDrum())
            env.process(pfi_drum(env=self.env,
                                 drumNumber=freeDrum, 
                                 facility=self))    

类初始值设定项进行了一些设置。函数只返回一个python列表。issueDrum()函数的任务是确保分类器机器中有一个空闲插槽,然后从未使用的目录返回一个鼓。{}设置{}用于旧桶,设置{}用于自由桶

run()函数中,我屈服于issueDrum(),然后将pfi_drum()作为进程调用。以下是pfi_drum()过程:

def pfi_drum(env, drumNumber, facility):
    """
    The PFI_drum process (each drum has a ``drumNumber`` carrying jellybeans of a certain ``size``) 
    arrives at the prefinish_machines (``pf``) and requests flavoring.

    It then starts the flavoring process, waits for its turn, and gets flavored.

    """

    ## requesting a classifier slot
    clf = yield facility.classifiers.get()
    print('PFI_Drum %d was attached to the classifier to get goods of Size %s at %.2f.' % (drumNumber, clf['id'], env.now))

    ## check the available classifier slots
    remainingSlots = len(facility.classifiers.items)
    if (remainingSlots>0):
        facility.availableSlot.succeed()

    ## getting filled
    time = facility.pfi_capacity/float(clf['rate'])
    yield env.process(facility.fillClassification(time))


    ## disengaging from classifier
    yield facility.classifiers.put(clf)
    print('PFI_Drum %d disengaged from classifier at time %.2f.' % (drumNumber, env.now))
    facility.availableSlot.succeed()

    ## requesting a prefinish machine
    with facility.pfi_machines.request() as request:
        yield request
        print('PFI_Drum %d enters prefinish operation at %.2f.' % (drumNumber, env.now))

        facility.pfi_directory[drumNumber] = 0
        yield env.process(facility.prefinish(drumNumber))

我的问题是,在某一点上,我的鼓被放入预精加工过程的队列中(这是非常缓慢的)。因此,如果资源同时使用了两个插槽,则它们将在队列中保留很长时间。但是,第一台机器不应继续运行,因为如果它脱离一个滚筒,则没有其他滚筒代替它

因此,我想学习如何暂停一个进程,更具体地说是一个超时,以便分类器在意识到根据目录没有空闲鼓时停止。这意味着没有鼓应该脱离。然后,我想在鼓再次可用时恢复分类器


Tags: theselfenvsizedefnum插槽yield