прежде всего, я должен упомянуть, что я не программист, а инженер-механик, поэтому, пожалуйста, не распинайте меня, если я что-то неправильно истолковал или произнес какую-то глупость.
Я хочу написать код python, который будет "имитировать" проблему реальной жизни. Реальная проблема жизни - это что-то вроде очереди FIFO, где объекты берутся с разных станций, и они проводят там некоторое время, а затем возвращаются в очередь.
Я понимаю, что мне нужно написать асинхронную программу, потому что у меня есть одна функция, которая помещает объекты в очередь (скажем каждые 15 секунд), а затем у меня есть несколько станций, которые берут только один объект из этой очереди, а затем работают это в течение некоторого времени (простой таймер и печать "Привет, я работаю над объектом x, верну его в: минуты".
Я не уверен, смогу ли я сделать это с помощью Threading? Что делать, если у меня было 100 станций, работающих асинхронно, можно запустить 100 потоков? Потому что, как я понимаю, каждый поток должен иметь один таймер?
Я бы попросил дать мне немного толчок к простейшему направлению, чтобы решить его, это не должно быть красивым, но функциональным и легким для меня.
заранее спасибо за каждую идею! С наилучшими пожеланиями, М.М.
Конечно, вы можете использовать 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() в очереди, чтобы дождаться завершения всех ожидающих задач.
Такой подход имеет то преимущество, что вы не создаете и не уничтожаете потоки, что дорого. Рабочие потоки будут выполняться непрерывно, но будут спать, когда в очереди нет заданий, используя нулевое время процессора.
Надеюсь, это поможет вам.
threading
отлично подойдет для того, что вы хотите. Недостатком многопоточности в cpython является то, что на самом деле только один поток может одновременно выполнять код Python. Но если ваши «рабочие» процессы просто имитируют работу поtime.sleep
то у вас все будет хорошо.