Szukaj…


Uwagi

Ze względu na GIL (globalną blokadę interpretera) tylko jedna instancja interpretera Pythona jest wykonywana w jednym procesie. Ogólnie rzecz biorąc, stosowanie wielowątkowości poprawia tylko obliczenia związane z IO, a nie obliczenia związane z procesorem. Moduł multiprocessing jest zalecany, jeśli chcesz równolegle wykonywać zadania związane z procesorem.

GIL ma zastosowanie do CPython, najpopularniejszej implementacji Pythona, a także PyPy. Inne implementacje, takie jak Jython i IronPython, nie mają GIL .

Korzystanie z modułu wieloprocesowego do równoległego wykonywania zadań

import multiprocessing

def fib(n):
    """computing the Fibonacci in an inefficient way
    was chosen to slow down the CPU."""
    if n <= 2:
        return 1
    else:
        return fib(n-1)+fib(n-2) 
p = multiprocessing.Pool() 
print(p.map(fib,[38,37,36,35,34,33]))

# Out: [39088169, 24157817, 14930352, 9227465, 5702887, 3524578]

Ponieważ wykonywanie każdego wywołania fib odbywa się równolegle, czas wykonania pełnego przykładu jest 1,8 × szybszy niż w przypadku sekwencyjnego przetwarzania na podwójnym procesorze.

Python 2.2+

Używanie skryptów nadrzędnych i podrzędnych do równoległego wykonywania kodu

child.py

import time

def main():
    print "starting work"
    time.sleep(1)
    print "work work work work work"
    time.sleep(1)
    print "done working"

if __name__ == '__main__':
    main()

parent.py

import os

def main():
    for i in range(5):
        os.system("python child.py &")

if __name__ == '__main__':
    main()

Jest to przydatne w przypadku równoległych, niezależnych zadań żądania / odpowiedzi HTTP lub wyboru / wstawiania bazy danych. Argumenty wiersza poleceń można również podać w skrypcie child.py . Synchronizacja między skryptami może być osiągnięta przez wszystkie skrypty regularnie sprawdzające osobny serwer (np. Instancję Redis).

Korzystanie z rozszerzenia C do równoległego wykonywania zadań

Chodzi o to, aby przenieść zadania wymagające intensywnych obliczeń do C (przy użyciu specjalnych makr), niezależnie od Pythona, i pozwolić, aby kod C zwalniał GIL podczas działania.

#include "Python.h"
...
PyObject *pyfunc(PyObject *self, PyObject *args) {
    ...
    Py_BEGIN_ALLOW_THREADS
    // Threaded C code
    ...
    Py_END_ALLOW_THREADS
    ...
}

Użycie modułu PyPar do równoległości

PyPar to biblioteka, która wykorzystuje interfejs przekazywania wiadomości (MPI) w celu zapewnienia równoległości w Pythonie. Prosty przykład w PyPar (widziany na https://github.com/daleroberts/pypar) wygląda następująco:

import pypar as pp

ncpus = pp.size()
rank = pp.rank()
node = pp.get_processor_name()

print 'I am rank %d of %d on node %s' % (rank, ncpus, node)

if rank == 0:
  msh = 'P0'
  pp.send(msg, destination=1)
  msg = pp.receive(source=rank-1)
  print 'Processor 0 received message "%s" from rank %d' % (msg, rank-1)
else:
  source = rank-1
  destination = (rank+1) % ncpus
  msg = pp.receive(source)
  msg = msg + 'P' + str(rank)
  pypar.send(msg, destination)
pp.finalize()


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow