Python, Simpy: приостановить функцию на период времени, пока выполняется другая функция

#python #python-3.x #callback #simulation #simpy

#python #python-3.x #обратный вызов #Симуляция #simpy

Вопрос:

Используя simpy , я хочу реализовать простой queueing симулятор, в котором пакеты обрабатываются пакетами заданного размера. По порядку слов: я хочу иметь симулятор, в котором отправляются пакеты (пакеты отправляются с некоторыми случайными интервалами). Когда пакет поступает, он добавляется в очередь. Теперь я хотел бы иметь процесс (независимый от процесса отправки пакетов), который обрабатывает пакеты, поступающие в очередь пакетами определенного размера 10 . Итак, как только в очереди находится не менее 10 пакетов, process_queue функция запускается для их обработки (т. Е. Печати на экране или выполнения чего-либо еще). Как только это будет завершено, функция снова проверяет, есть ли хотя бы 10 пакеты в очереди. Если да, он принимает первые 10 пакеты и обрабатывает. Если в очереди меньше 10 пакетов, функция ожидает поступления большего количества пакетов. Таким образом, пакеты обрабатываются один за другим, а не параллельно.

Пока это то, что я реализовал:

 import simpy
import random


class Queue:

    def __init__(self, env):
        self.env = env
        self.queue = []
        env.process(self.add_packets())

   def add_packets(self):
        i = 0
        while i < 1000:
            self.queue.append(i)
            i  = 1
            self.env.timeout(random.randint(0, 20))


   def queue_checking(self):
       if len(self.queue) > 10:
           self.env.process(self.process_queue())           

   def process_queue(self):
       batch = self.queue[:10]
       for i in batch:
           self.queue.remove(i)
           // here is some operations I do on the packet 
       print("Finished processing batch")
  

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как теперь объединить эти 3 функции таким образом, чтобы при наличии как минимум 10 пакетов в очереди process_queue функция запускалась, но в то же время, как только функция process_queue запускается, мы должны дождаться ее завершения, прежде чем мы начнемначните обрабатывать еще 10 пакетов из очереди, т. Е. До того, как мы снова вызовем ту же функцию (если нужно). Итак, в конечном итоге я хотел бы, чтобы мой симулятор продолжал получать пакеты, но в то же время обрабатывал полученные пакеты следующим образом: возьмите первые 10 пакетов из очереди, обработайте, проверьте и, если применимо (т. Е., Если есть более 10 пакетов), возьмите следующие 10, обработайте, проверьте иполучите следующие 10 и т. Д. И т. Д. Заранее большое спасибо!

Комментарии:

1. Вероятно, вам придется использовать потоки для одновременного запуска этих процессов.

2. @Hylke О, я понимаю, так simpy сам по себе не может справиться с этим? Пример того, как это сделать, учитывая мой код, был бы очень полезен!

3. Я не очень хорошо знаком с библиотекой, поэтому, боюсь, не смогу привести вам пример. Но я совершенно уверен, что вам нужна эта библиотека или что-то подобное для одновременного запуска нескольких процессов python. Это потому, что по замыслу Python является процедурным языком, то есть он просто выполняет все пошагово

4. Можно ли просто вызывать «queue_checking» внутри функции «def add_packets (self)» каждый раз, когда в очередь добавляется новый пакет?