Разочарован многопроцессорным модулем в Python (Windows Server 2008) - PullRequest
2 голосов
/ 18 марта 2019

Я имею дело с задачей, связанной с ЦП, и пытаюсь использовать многопроцессорный модуль на моем сервере для ускорения вычислений.Конфигурация выглядит следующим образом:

  • система: Windows Server 2008 r2
  • ОЗУ: 32 г ОЗУ
  • ядро: (Intel E5-2643 v2 @ 3,5 ГГц) *12
  • Среда: Pycharm & python 3.6

Когда я открываю более 4 ядер, окно сообщений об ошибках продолжает появляться и говорит, что python перестает работать с именем модуля сбоя StackHash_1dc2.Кажется, это проблема одного подпроцесса, потому что другой подпроцесс работает нормально, но с этой ошибкой основной процесс не может завершиться автоматически.Проблема в том, что если я запускаю один и тот же код 5 раз подряд, ошибка может произойти только в 2 раза, поэтому я считаю, что это не ошибка, а нечто гораздо более худшее.

Однако,Я не смог воспроизвести ошибку на моем собственном компьютере, потому что он имеет только 4 ядра.Я знаю, что глупо использовать многопроцессорность в Windows, но я не могу изменить систему на сервере.Что я могу сделать, чтобы сделать это правильно?

Ниже приведен только пример кода, который может возникнуть проблема на моем сервере:

import multiprocessing
import pandas as pd
from scipy import stats

def func(msg):
    print('Hello, ', msg)
    a = []
    for i in range(50):
        I = 200000
        S = pd.DataFrame([0.03] * I)
        d1 = (0.04 - S[0]) / 0.004
        p = stats.norm.cdf(d1, 0, 1)
        a.append(p.sum())
    print('Goodbye,', msg)

def run():
    if __name__ == '__main__':
        multiprocessing.freeze_support()
        pool = multiprocessing.Pool(processes=11)

        for i in range(20):
            msg = '%d' % (i)
            pool.apply_async(func,(msg, ))

        print('Mark~~~~~~~~~~~~~~~')
        pool.close()
        pool.join()
        print('sub-process done')

if __name__ == '__main__':
    run()

1 Ответ

0 голосов
/ 19 марта 2019

Есть такая же проблема.При использовании пула многопроцессорной обработки каждый подпроцесс должен записывать несколько меток, но некоторые выходные метки отсутствуют, а Python (3.6.5) дает сбой.Имя события проблемы BEX64 и тот же модуль ошибки StackHash_1dc2.Я думаю, что это либо доступ к памяти, либо конфликт записи из-за взаимодействия нескольких подпроцессов.Проблема решается, когда я ограничиваю каждый процесс написанием одного рассола.В приведенном выше коде у вас есть несколько подпроцессов, добавляющих в список a (каждый подпроцесс будет пытаться открыть и записать в дискретную копию этого списка, если он не объявлен как разделяемый через менеджер многопроцессорной обработки, я думаю).список должен быть объявлен как общий ресурс для многопроцессорной обработки (но я не знаю, как это сделать).

...