Параллельная обработка / многопоточность в 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()

3 ответа

Решение

Вы можете использовать любой подход. Иметь свой 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

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

Вот самый простой способ сделать несколько вещей параллельно, это поможет вам начать:

источник

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

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

from thread import start_new_thread

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

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

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

Другие вопросы по тегам