У меня есть последовательная модель потребителя-производителя, выполнение которой занимает много времени. Поэтому я пытаюсь заставить потребительский код работать одновременно.
Примечание: объекты - это генератор.
func report_object(self, object_type, objects):
for obj in objects:
try:
change_handler(obj, self.config)
except Exception as e:
LOG.error("Error occurred in handling object: %s" % e)
LOG.exception(e)
else:
LOG.info(" Consumer: no objects reported")
Потоковая реализация вышеуказанной функции:
import threading
func report_object(self, object_type, objects):
threads = []
for obj in objects:
try:
t = threading.Thread(target=change_handler,args=(obj, self.config))
LOG.info(" ***** Number of active threads: %d *****", threading.activeCount())
t.start()
threads.append(t)
except Exception as e:
LOG.error("Error occurred in handling object: %s" % e)
LOG.exception(e)
for t in threads:
t.join()
else:
LOG.info(" Consumer: no objects reported")
Если следовать вышеуказанному механизму, я запускаю столько потоков, сколько len (объектов). В этом случае, если объекты станут такими огромными, как 1000/10000, каково будет влияние? Будет ли состояние гонки? Если да, то как я могу предотвратить это? Я попробовал другое решение, например:
threads = [ threading.Thread(target=change_handler,args=(obj, self.config)) for _ in range(8)]
for thread in threads:
thread.start()
LOG.info(thread.name)
for thread in threads:
thread.join()
Количество активных потоков все еще увеличивается. Что было бы лучшим способом ограничить количество активных потоков и лучшим способом заставить вышеупомянутую функцию работать одновременно.