#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-го аргумента потоку.