import multiprocessing
import time
def task_function(x):
print(f"Processing {x} in process {multiprocessing.current_process().name}")
time.sleep(1)
def main():
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
with multiprocessing.Pool(processes=4) as pool:
pool.map_async(task_function, data)
print("Waiting for tasks to complete...")
pool.close()
pool.join()
print("All tasks completed.")
if __name__ == "__main__":
main()
Я не знаю, почему в приведенном выше коде метод join() правильно блокирует код, чтобы он продолжал работать. Но в одном из моих сложных случаев использования метод join() недействителен.
Ниже приведена часть моего сложного кода.
with multiprocessing.Pool(processes=4) as read_pool:
# read_pool = multiprocessing.Pool(4)
read_jobs = read_pool.map_async(
func=read_image_task,
iterable=[(filename, image_directory, queue) for filename in images_to_ocr]
)
read_pool.close()
read_pool.join()
print(123) # before running the read_image_task function, it print 123
и как ни странно, когда я добавляю этот read_jobs.get(), он успешно блокируется и не печатает 123.
read_pool.join()
read_jobs.get()
print(123)
Подробнее здесь: https://stackoverflow.com/questions/793 ... owing-code
Python игнорирует Pool.join() и продолжает выполнять следующий код? ⇐ Python
-
Olwork
Re: Python игнорирует Pool.join() и продолжает выполнять следующий код?
Для multiprocessing pool не применяются команды join и close, это запуск подпроцессов, а не потоков.
И это уже готовый блок, который выполнится сам и выдаст ответ, можно также использовать callback.
Функции map и starmap отличаются тем что передаваемая функция принимает разное количество параметров. В случае с map только одно, starmap соответственно принимает несколько параметров в виде кортежа или списка.
К результатам асинхронных функций необходимо применить get(), иначе видишь обьект.
Пример:
# запускаем пул процессов
with mp.Pool(processes=len(args)) as pool:
# размерность аргументов кортежа
if isinstance(args[0], list) or isinstance(args[0], tuple):
self.data_pool = pool.starmap_async(func, args, callback=self.scale_progress).get()
else:
self.data_pool = pool.map_async(func, args, callback=self.scale_progress).get()
Ну а этот пул можно уже положить в поток.
И это уже готовый блок, который выполнится сам и выдаст ответ, можно также использовать callback.
Функции map и starmap отличаются тем что передаваемая функция принимает разное количество параметров. В случае с map только одно, starmap соответственно принимает несколько параметров в виде кортежа или списка.
К результатам асинхронных функций необходимо применить get(), иначе видишь обьект.
Пример:
# запускаем пул процессов
with mp.Pool(processes=len(args)) as pool:
# размерность аргументов кортежа
if isinstance(args[0], list) or isinstance(args[0], tuple):
self.data_pool = pool.starmap_async(func, args, callback=self.scale_progress).get()
else:
self.data_pool = pool.map_async(func, args, callback=self.scale_progress).get()
Ну а этот пул можно уже положить в поток.
Мобильная версия