Отправка данных (буфер BytesIO) через канал работает, но вызывает исключение Fatal Python

При использовании Python 2.7 в Windows следующий код работает, но вызывает проблему с msvc.

import io
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt2
from multiprocessing import Process, Pipe

def tmpPlot(conn):
  plt.plot([1,2,4,2])
  plt.title("title")

  buf = io.BytesIO()
  plt.savefig(buf, format='png')
  buf.seek(0)
  conn.send(plt.imread(buf))
  conn.close

if __name__ == '__main__':
  parent_conn, child_conn = Pipe()
  p = Process(target=tmpPlot, args=(child_conn,))
  p.start()

  imgData = parent_conn.recv()

  imgplt = plt2.imshow(imgData)

  plt2.show()

Вот ошибка:

Ошибка MSVC

Вслед за этим сообщение pythonw.exe перестало работать:

  Problem signature:
  Problem Event Name:   APPCRASH
  Application Name: pythonw.exe
  Application Version:  0.0.0.0
  Application Timestamp:    59bd8782
  Fault Module Name:    python27.dll
  Fault Module Version: 2.7.14150.1013
  Fault Module Timestamp:   59bd877e
  Exception Code:   40000015
  Exception Offset: 0014098b
  OS Version:   6.0.6002.2.2.0.768.3
  Locale ID:    1033
  Additional Information 1: ac4a
  Additional Information 2: 817fddeef0c50f6183a834229ec12634
  Additional Information 3: 3df9
  Additional Information 4: 47d9390827b4b422b52d14c0c48ab5d9

Read our privacy statement:
  http://go.microsoft.com/fwlink/?linkid=50163&clcid=0x0409

person user3701730    schedule 30.10.2017    source источник
comment
Похоже, это зависит от использования pyplot в потоке. См. этот упрощенный пример, который должен работать нормально. Если вы затем раскомментируете строку pyplot, возникнет ошибка. Все это не зависит от использования буфера.   -  person ImportanceOfBeingErnest    schedule 30.10.2017
comment
Дополнительное тестирование показало, что добавление задержки после оператора conn.send(data) позволяет избежать ошибки. Есть ли более элегантный способ определить, что команда отправки завершена? или ждать, пока это будет сделано вместо произвольного количества времени?   -  person user3701730    schedule 31.10.2017
comment
используемая задержка - time.sleep(.001), похоже, не имеет значения, как долго он спит   -  person user3701730    schedule 31.10.2017


Ответы (1)


Добавление короткой команды сна, кажется, помогает...

conn.send(plt.imread(buf))
time.sleep(.001)
conn.close

Не элегантно, но работает.

person user3701730    schedule 01.11.2017