Параллельная обработка / многопоточность в Python

#python #multithreading #multiprocessing

#python #многопоточность #многопроцессорность

Вопрос:

Я хочу использовать многопроцессорную обработку или многопоточность в своем приложении для выполнения некоторых трудоемких операций в фоновом режиме. Я просмотрел много примеров, но мне все еще не удалось достичь того, чего я хочу. Я пытаюсь загрузить кучу изображений, каждое из которых занимает несколько секунд. Я хотел бы, чтобы первое изображение было загружено, а затем другие загружались в фоновом режиме и сохранялись в списке (для последующего использования), пока программа все еще выполняет другие действия (например, позволяет элементам управления в моем графическом интерфейсе все еще работать). Если у меня есть что-то вроде приведенного ниже примера, как я могу это сделать? И должен ли я использовать многопроцессорную обработку или многопоточность?

 class myClass():
    def __init__(self, arg1, arg2):
        #initializes some parameters

    def aFunction(self):
        #does some things
        #creates multiple processes or threads that each call interestingFunc
        #continues doing things

    def interestingFunc(self):
        #performs operations

m = myClass()
  

Ответ №1:

Вы можете использовать любой подход. Пусть ваш Process или Thread выполнит свою работу, а затем поместит результаты в Queue . Затем ваш основной поток / процесс может, на досуге, удалить результаты из очереди и что-то с ними сделать. Вот пример с многопроцессорностью.

 from multiprocessing import Process, Queue

def load_image(img_file, output_q):
    with open(img_file, 'rb') as f:
        img_data = f.read()
        # perform processing on img_data, then queue results
        output_q.put((img_file, img_data))

result_q = Queue()
images = ['/tmp/p1.png', '/tmp/p2.jpg', '/tmp/p3.gif', '/tmp/p4.jpg']

for img in images:
    Process(target=load_image, args=(img, result_q)).start()

for i in range(len(images)):
    img, data = result_q.get()
    # do something with the image data
    print "processing of image file %s complete" % img
  

Это предполагает, что порядок обработки не имеет значения для вашего приложения, т. Е. Данные изображения из каждого файла могут быть загружены в очередь в любом определенном порядке.

Ответ №2:

Вот самый простой из возможных способов параллельного выполнения нескольких задач, он поможет вам начать:

Источник

 import multiprocessing

def calc(num):
    return num*2

pool = multiprocessing.Pool(5)
for output in pool.map(calc, [1,2,3]):
    print 'output:',output
  

вывод

 output: 2
output: 4
output: 6
  

Ответ №3:

Вы могли бы попробовать что-то вроде этого:

 from thread import start_new_thread

pictureList = [ f for f in os.listdir(r"C:yourpicturefolder")]
for pic in pictureList:
    start_new_thread(loadPicture,(pic,))

def loadPicture(pic):
    pass # do some stuff with the pictures
  

Это довольно простой подход, поток возвращается немедленно, и, возможно, вам нужно будет использовать allocate_lock . Если вам нужны дополнительные возможности, вы можете рассмотреть возможность использования модуля threading. Будьте осторожны, передавая tuple в качестве 2-го аргумента потоку.