Параллельные вычисления

Введение

Примеры

  • Использование многопроцессорного модуля для распараллеливания задач

     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]
    
     

    Поскольку выполнение каждого вызова fib происходит параллельно, время выполнения полного примера 1,8 × быстрее , чем если бы сделано последовательным образом на двойной процессор.

    Python 2.2+

  • Использование сценариев Parent и Children для параллельного выполнения кода

    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()
    
     

    Это полезно для параллельных, независимых задач HTTP-запроса / ответа или выбора / вставки базы данных. Аргументы командной строки может быть дан child.py сценария , а также. Синхронизация между сценариями может быть достигнута всеми сценариями, регулярно проверяющими отдельный сервер (например, экземпляр Redis).

  • Использование C-расширения для распараллеливания задач

    Идея здесь состоит в том, чтобы переместить вычислительные задания на C (с помощью специальных макросов), независимо от Python, и заставить код C освобождать GIL во время его работы.

     #include "Python.h"
    ...
    PyObject *pyfunc(PyObject *self, PyObject *args) {
        ...
        Py_BEGIN_ALLOW_THREADS
        // Threaded C code
        ...
        Py_END_ALLOW_THREADS
        ...
    } 
  • Использование модуля PyPar для распараллеливания

    PyPar - это библиотека, которая использует интерфейс передачи сообщений (MPI) для обеспечения параллелизма в Python. Простой пример в PyPar (как видно на https://github.com/daleroberts/pypar ) выглядит следующим образом :

    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()

Синтаксис

Параметры

Примечания