【问题标题】:Sending data (BytesIO buffer) through a Pipe works but causes a Fatal Python exception通过管道发送数据(BytesIO 缓冲区)可以工作,但会导致致命的 Python 异常
【发布时间】:2018-04-11 21:33:47
【问题描述】:

在 Windows 上使用 Python 2.7,以下代码可以工作,但会导致 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()

这里是错误:

随后是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

【问题讨论】:

  • 这似乎取决于线程中pyplot 的使用。请参阅this simplified example,它应该可以正常工作。如果您随后取消注释 pyplot 行,则会引发错误。这完全取决于使用缓冲区。
  • 其他测试表明,在 conn.send(data) 语句之后添加延迟可以避免错误。有没有更优雅的方法来检测发送命令是否完成?还是等到它完成而不是任意时间?
  • 使用的延迟是time.sleep(.001),睡多久好像没关系

标签: python python-2.7 matplotlib pipe multiprocessor


【解决方案1】:

添加一个简短的睡眠命令似乎可以解决问题......

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

不优雅但有效。

【讨论】:

    猜你喜欢
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2015-04-15
    • 2020-08-14
    相关资源
    最近更新 更多