У меня возникают проблемы с зависанием моей программы, когда я пытаюсь создать графики в пуле с Seaborn / Matplotlib.Выполнение кода в пуле само по себе хорошо, но если я запускаю какой-то другой код перед ним, который также делает цифры, я получаю ошибки, и программа зависает (см. Вывод ошибок ниже).Этот код является очень упрощенным примером, в котором мне удалось частично воспроизвести ошибку, но когда я запускаю ее в моем реальном проекте, весь мой компьютер зависает, и мне нужно войти в новый сеанс и killall python3, чтобы разморозить.Наборы данных, которые я использую, и программа, которая у меня есть, довольно сложны, поэтому я надеюсь, что этого примера кода будет достаточно.Похоже, что сообщения об ошибках как-то связаны с сервером отображения X, поэтому я думаю, что это та же проблема.
Если я запускаю функцию make_boxplot без вызова функций из пула, она работает нормально, и наоборот,но если я запускаю их вместе в одном скрипте, появляются ошибки, показанные ниже.
Что может быть причиной этого?Судя по выводам, кажется, что он зависает при вызове plt.figure.
import matplotlib.pyplot as plt
from multiprocessing import Pool
import os
import seaborn as sns
import pandas as pd
def make_figure(name):
print("making figure " + name)
fig1 = plt.figure(figsize=(12, 12))
print("created figure " + name)
ax = fig1.add_subplot(1, 1, 1)
ax.figure.savefig("temp_out/" + name + ".png")
plt.close(fig1)
def make_boxplot():
fig1 = plt.figure(figsize=(12, 12))
ax = fig1.add_subplot(1, 1, 1)
index = ['frank', 'jen', 'cindy', 'jabba']
a = pd.Series(data=[5, 10, 20, 22], index=index, name='a')
b = pd.Series(data=[7, 9, 5, 6], index=index, name='b')
c = pd.Series(data=[3, 2, 1, 4], index=index, name='c')
df = pd.concat([a, b, c], axis=1)
# sns.boxplot(data=df, palette="Set3", ax=ax)
# for item in ax.get_xticklabels():
# item.set_rotation(90)
fig1.savefig("temp_out/" + "my_boxplot.png")
plt.close(fig1)
if not os.path.exists("temp_out"):
os.makedirs("temp_out")
make_boxplot()
names = ['bob', 'billy', 'josef', 'jane', 'tarzan', 'phil', 'cindy']
pool = Pool(4)
pool.map_async(make_figure, names)
pool.close()
pool.join()
Вывод:
making figure bob
making figure billy
making figure josef
making figure jane
XIO: fatal IO error 0 (Success) on X server ":1"
after 432 requests (432 known processed) with 25 events remaining.
XIO: fatal IO error 25 (Inappropriate ioctl for device) on X server ":1"
after 428 requests (428 known processed) with 25 events remaining.
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":1"
after 428 requests (428 known processed) with 23 events remaining.
making figure tarzan
making figure phil
making figure cindy
created figure cindy
created figure phil
created figure tarzan