2014-12-22 2 views
0

У меня есть программа на Python, который создает пул многопроцессорной и вызывает процедуру Cythonized, что делает некоторые тяжелые вычисления вызова sin, cos, exp, tan, atan от libc.math и делать много leastsq оптимизаций. Без многопроцессорности все работает отлично.Multiprocessing вызывает Python аварии на Windows,

Если я использую multiprocessing.pool на pool.join() все процессы аварии с довольно бесполезное сообщение

Это приложение просил Runtime прекратить его в необычным способом. Обратитесь в службу поддержки приложения за дополнительной информацией .

Родительский процесс продолжает работать после этого, но при закрытии приложения он также сбой.

дамп содержит следующую информацию

Problem signature: 
    Problem Event Name:  APPCRASH 
    Application Name:   python.exe 
    Application Version:  0.0.0.0 
    Application Timestamp: 527fcf56 
    Fault Module Name:  libgcc_s_dw2-1.dll 
    Fault Module Version:  0.0.0.0 
    Fault Module Timestamp: 4bc96cad 
    Exception Code:   40000015 
    Exception Offset:   00016646 
    OS Version:    6.1.7601.2.1.0.256.1 
    Locale ID:    1033 
    Additional Information 1: 9155 
    Additional Information 2: 9155109303dda76ab293160797d571e1 
    Additional Information 3: de56 
    Additional Information 4: de566ab6f110978dbca8423195800025 

Обновления: Я сделал отдельный чек с вызовом фиктивной функции. Он все еще падает. С map, map_async, apply, apply_async. Это происходит только внутри моей программы. Простые сценарии пула работают.

код Бассейн находится за if __name__ == '__main__':

Это выглядит как-то «длл ад», но я не уверен, как и где, чтобы проверить это.

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

def func1(a): 
    print a 

def ExtractStarData(self): 
    nprocs=2 

    if __name__ == '__main__': 
     print 'pool' 
     pool = Pool(processes=nprocs) 
     print 'results' 
     pool.map(func1, range(100)) 
     print 'close' 
     pool.close() 
     print 'join' 
     pool.join() #crashes here 
     print 'ok' 

я забыл упомянуть. Код (реальный, а не фиктивный) работает на OSX, но не на Win7!

+0

Ваш код? – quant

+0

Я понятия не имею, что произойдет, если вы положите 'if __name__ == '__main __':' в функцию. Вы уверены, что это не проблема? Как вы называете «ExtractStarData»? –

+0

Произошла какая-то магия. Вчера, пробовав бесчисленное количество раз, чтобы сделать это, я расстроился, сделал этот пост и поставил свой компьютер на сны. Сегодня все работает! И да, я вчера перезагрузил свой компьютер. –

ответ

0

мне пришлось изменить код немного:

from multiprocessing import Pool 
def func1(a): 
    print a 

if __name__ == '__main__': 
    nprocs=2 
    print 'pool' 
    pool = Pool(processes=nprocs) 
    print 'results' 
    pool.map(func1, range(10)) 
    print 'close' 
    pool.close() 
    print 'join' 
    pool.join() #crashes here 
    print 'ok' 

Когда я запускаю его я перепутать выход:

>C:\Python27\python.exe mp_debug.py 
pool 
results 
02 

13 

46 

57 

8 
9 
close 
join 
ok 

Возможно ли, что вам нужно lock на вашей функции, func1 ?

0

Проблема возникла, и я провел более тщательное расследование. Я смог проследить проблему до компилятора mingw32, используемого для компиляции модуля cython. После установки Microsoft VC++ для Python 2.7 и установки в качестве компилятора по умолчанию все вернулось к нормальному состоянию. У вас есть ссылка на компилятор: http://www.microsoft.com/en-us/download/details.aspx?id=44266

+0

Не могли бы вы рассказать об этом ответе? Я скомпилировал расширение C с помощью mingw32, и теперь у меня есть такая же проблема, используя его с многопроцессорной обработкой.Обычно я использую инструменты, которые поставляются с MinGW/MSYS, например make. Теперь, когда мне нужно использовать компилятор Microsoft VC++, что мне делать? –