Пытается понять многопроцессорные документы Python.Я бы поставил это на мета, но я не уверен, может ли это быть полезным для искателей позже.
Мне нужно некоторое руководство относительно того, как эти примеры относятся к многопроцессорности.
Правильно ли я считаю, что многопроцессорная обработка использует несколько процессов (и, следовательно, процессоров) для того, чтобы разбить итеративную задачу и, следовательно, сократить ее продолжительность?
from multiprocessing import Process
def f(name):
print('hello', name)
if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
p.join()
Мы начинаем один процесс;но как мне начать несколько, чтобы завершить мою задачу?Перебирать ли я строки Process + start ()?
Тем не менее, в документации нет примеров, например:
for x in range(5):
p[x]=Process(target=f, args=('bob',))
p[x].start()
p.join()
Это будет 'Реальная реализация '?
Вот "Пример очереди":
from multiprocessing import Process, Queue
def f(q):
q.put([42, None, 'hello'])
if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print(q.get()) # prints "[42, None, 'hello']"
p.join()
Но, опять же, как эта многопроцессорная обработка?Это просто запуск процесса и запуск объектов в очереди?Как заставить несколько процессов запускать и запускать объекты в очереди?
Наконец, для пула:
from multiprocessing import Pool
import time
def f(x):
return x*x
if __name__ == '__main__':
with Pool(processes=4) as pool: # start 4 worker processes
result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously in a single process
print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow
Четыре процесса выполняют 10x10 одновременнои он ждет, пока все четыре не вернутся, или это сделает только один, потому что мы дали пулу только один аргумент?Если первое: Разве это не будет медленнее, чем просто сделать это первым?Как насчет памяти?Сохраняем ли мы результат процесса 1 до тех пор, пока процесс 4 не вернется в ОЗУ или он не будет напечатан?
print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"
it = pool.imap(f, range(10))
print(next(it)) # prints "0"
print(next(it)) # prints "1"
print(it.next(timeout=1)) # prints "4" unless your computer is *very* slow
result = pool.apply_async(time.sleep, (10,))
print(result.get(timeout=1)) # raises multiprocessing.TimeoutError