1

См. Пример кода ниже. Симптомом является то, что requests.get(url) в пределах multiprocessingPool, по-видимому, каким-то образом блокируется matplotlibfigure().Requests.get в многопроцессорном пуле, заблокированном фигурой Matplotlib?

Ингредиенты, необходимые для воспроизведения этого довольно неожиданное поведение являются:

  1. Используйте multiprocessingPool применить функцию к списку; равнина request.get(url) после plt.figure() бежит свободно.
  2. Функция для Poolmap содержит requests.get; используя другую «более простую» функцию, такую ​​как функция идентификации (например, f в образце кода), бегает свободно.
  3. Перед запуском бассейна создайте matplotlib figure; без этого figure, код бежит свободно. Пример

Код:

# matplotlib.__version__: 1.4.3 
# requests.__version__: 2.9.1 
# Python version: 
# 2.7.12 |Anaconda 2.3.0 (x86_64)| (default, Jul 2 2016, 17:43:17) 
# [GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)] 
# uname -a: 
# Darwin myMBP 16.4.0 Darwin Kernel Version 16.4.0: 
# Thu Dec 22 22:53:21 PST 2016; 
# root:xnu-3789.41.3~3/RELEASE_X86_64 x86_64 i386 MacBookPro11,3 Darwin 


from matplotlib import pyplot as plt 
from multiprocessing import Pool 
import requests 

urls = ['http://stackoverflow.com'] 

# Runs as expected: 
p = Pool(processes=1) 
print 1, p.map(requests.get, urls) 

# Runs as expected: 
def f(x): 
    return x 
fig = plt.figure() 
p = Pool(processes=1) 
print 2, p.map(f, urls) 

# Will not run (the p.map takes forever to run): 
fig = plt.figure() 
p = Pool(processes=1) 
print 3, p.map(requests.get, urls) 

# REPLACING the previous block with the following 
# will again runs as expected: 
fig = plt.figure() 
print 4, requests.get(urls[0]) 

Выход образца кода:

1 [<Response [200]>] 
2 ['http://stackoverflow.com'] 
3 
+0

Он работал здесь с Python 2.7.9, matplotlib 1.4.2 и запросами 2.4.3. –

+0

@ J.P.Petersen Я пробовал ваши версии с 'conda env'; все еще не работает ... – FJDU

+0

1. Если это новый проект, рекомендуется использовать python 3.6 для python 2.7; 2. для запуска одновременных HTTP-запросов, 'threading' является предпочтительным для' multiprocessing'; 3. Используйте 'concurrent.futures.ThreadPoolExecutor' (встроенный в python3 или' pip install futures' в python 2) для [упрощенного параллелизма] (http://pythonhosted.org/futures/#threadpoolexecutor-example) в python. – Udi

ответ

0

Если вы работаете это в окнах, вам нужно будет переместить весь код ниже def f() в:

if __name__ == "__main__": 

блок.

+0

Я использую macOS 10.12.3 – FJDU

+0

У меня такая же проблема на macOS 10.12.3, python 3.5.1. Он отлично работает на Ubuntu 16.04 –

+0

Вам, вероятно, нужно будет открыть ошибку при отладке ошибок matplotlib – Udi

Смежные вопросы