Понимание многопроцессорной документации Python - PullRequest
0 голосов
/ 25 июня 2018

Пытается понять многопроцессорные документы 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
...