擅长:python、mysql、java
<p>为了扩展Michael的回答,这似乎是范围界定和您使用的API的问题。一般来说,纯Python不会出错。或者至少,它不应该出现seg错误,除非解释器中有bug,或者您正在使用的扩展。这并不是说纯Python不会崩溃,只是一个真正的seg错误表明这个问题可能是代码之外的混乱导致的。你知道吗</p>
<p>我假设你用的是<a href="https://github.com/gotthardp/python-mercuryapi" rel="nofollow noreferrer">this Python API</a>。你知道吗</p>
<p>在这种情况下自述文件.md提到您使用的<code>Reader.start_reader()</code>方法是“异步的”。这意味着它调用一个新的线程或进程并立即返回,然后每次扫描某个内容时,后台线程继续调用回调。你知道吗</p>
<p>我对CPython的本质知之甚少,无法确切地说明发生了什么,但是您已经将<code>IDS = []</code>声明为一个全局变量,而且似乎后台线程正在使用与主程序不同的上下文运行回调。因此,当它试图访问<code>IDS</code>时,它正在读取它不拥有的内存,因此出现seg错误。你知道吗</p>
<p>由于回调的限制性和明显的缓冲区不足,这可能是开发人员的疏忽。如果您真的需要异步读取,那么值得向他们发送问题报告。你知道吗</p>
<p>否则,考虑到您只是在等待输入,您可能不需要异步读取,您可以在自己的忙循环中使用synchronous<code>Reader.read()</code>方法,而不是像这样:</p>
<pre><code>try:
while True:
readTags(r.read(timeout=10))
except KeyboardInterrupt: ## break loop on SIGINT (Ctrl-C)
pass
</code></pre>
<p>请注意,<code>r.read()</code>返回一个标记列表,而不仅仅是一个标记列表,因此您需要稍微修改回调,如果您编写的不仅仅是一个快速脚本,那么您可能希望使用线程来正确中断循环,因为SIGINT非常有黑客性。你知道吗</p>