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