【问题标题】:Segmentation fault in a python with queue and mutithreading具有队列和多线程的python中的分段错误
【发布时间】:2014-10-04 16:36:55
【问题描述】:

我在 python 程序中有Segmentation fault,但不知道是什么原因造成的:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffebfff700 (LWP 13584)]
0x00007ffff2e73492 in flag_bsearch(unsigned short*, unsigned short, int) ()
   from /usr/lib/x86_64-linux-gnu/libhunspell-1.3.so.0

我所做的基本上是填充一些工作线程的队列,这些工作线程将以如下速度处理作业(这里是link for complete code):

for worker in self.workers:
    # if worker's queue is full block otherwise enqueue without blocking
    if worker.comments_queue.full():
        worker.comments_queue.put(comment)
    else:
        worker.comments_queue.put_nowait(comment)

当我启用一个工人时我没有这个问题,只有当我启用至少两个工人时才会发生分段错误(这里是link for complete code):

analyzer = AnalyzerManager()
#analyzer.register(LengthAnalyzer())
analyzer.register(LanguageAnalyzer())
#analyzer.register(UserAnalyzer())
analyzer.register(SentimentAnalyzer())

有什么提示可以找出导致此问题的原因吗?

【问题讨论】:

    标签: python multithreading queue segmentation-fault


    【解决方案1】:

    嗯,最好的办法是查看你得到的回溯。它表明段错误发生在 libhunspell.so 内部,它是 Hunspell 包的一部分。 guess_language 模块使用它。由于仅在多个线程运行时才会发生段错误,因此至少 显示 hunspell 不是线程安全的。因此,您需要确保一次只有一个线程在访问guess_language。使用threading.Lock() 应该很容易。我会在你的包中创建一个辅助函数,如下所示:

    from guess_language import guess_language
    import threading
    
    guess_lock = threading.Lock()
    def guess_language_thread_safe(text):
        with guess_lock:
            return guess_language(text)
    

    并在您当前正在使用guess_language 的代码中直接调用guess_language_thread_safe

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 2015-06-09
      相关资源
      最近更新 更多