Asynhronus, многопоточное моделирование реального жизненного процесса

1

прежде всего, я должен упомянуть, что я не программист, а инженер-механик, поэтому, пожалуйста, не распинайте меня, если я что-то неправильно истолковал или произнес какую-то глупость.

Я хочу написать код python, который будет "имитировать" проблему реальной жизни. Реальная проблема жизни - это что-то вроде очереди FIFO, где объекты берутся с разных станций, и они проводят там некоторое время, а затем возвращаются в очередь.

Я понимаю, что мне нужно написать асинхронную программу, потому что у меня есть одна функция, которая помещает объекты в очередь (скажем каждые 15 секунд), а затем у меня есть несколько станций, которые берут только один объект из этой очереди, а затем работают это в течение некоторого времени (простой таймер и печать "Привет, я работаю над объектом x, верну его в: минуты".

Я не уверен, смогу ли я сделать это с помощью Threading? Что делать, если у меня было 100 станций, работающих асинхронно, можно запустить 100 потоков? Потому что, как я понимаю, каждый поток должен иметь один таймер?

Я бы попросил дать мне немного толчок к простейшему направлению, чтобы решить его, это не должно быть красивым, но функциональным и легким для меня.

заранее спасибо за каждую идею! С наилучшими пожеланиями, М.М.

  • 0
    Похоже, threading отлично подойдет для того, что вы хотите. Недостатком многопоточности в cpython является то, что на самом деле только один поток может одновременно выполнять код Python. Но если ваши «рабочие» процессы просто имитируют работу по time.sleep то у вас все будет хорошо.
Теги:
multithreading
timer

1 ответ

1

Конечно, вы можете использовать Threading для одновременного запуска нескольких процессов.

Вы должны создать такой класс:

from threading import Thread

class Work(Thread):

    def __init__(self):
        Thread.__init__(self)
        self.lock = threading.Lock()

    def run(self): # This function launch the thread
        (your code)

если вы хотите запустить несколько потоков одновременно:

def foo():
    i = 0
    list = []
    while i < 10:
        list.append(Work())
        list[i].start() # Start call run() method of the class above.
        i += 1

Будьте осторожны, если вы хотите использовать одну и ту же переменную в нескольких потоках. Вы должны заблокировать эту переменную, чтобы они не доходили до этой переменной одновременно. Как это:

lock = threading.Lock()
lock.acquire()
try:
    yourVariable += 1 # When you call lock.acquire() without arguments, block all variables until the lock is unlocked (lock.release()).
finally:
    lock.release()

Из основного потока вы можете вызвать join() в очереди, чтобы дождаться завершения всех ожидающих задач.

Такой подход имеет то преимущество, что вы не создаете и не уничтожаете потоки, что дорого. Рабочие потоки будут выполняться непрерывно, но будут спать, когда в очереди нет заданий, используя нулевое время процессора.

Надеюсь, это поможет вам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню