Python在线程中的函数超时,返回非pickleable对象

时间:2017-02-27 21:58:01

标签: python multithreading timeout python-multiprocessing

我正在尝试对在python中的线程中运行的函数设置超时。我的第一次尝试是使用一个信号,正如这里的任意数量的答案中所建议的那样,但是因为我希望超时的函数有时会在一个线程中运行(作为允许花费一些时间的较大函数的一部分),原来不是一个选择。

然后我尝试了this answer,其中涉及使用Thread类中的multithreading。这在初始测试中运行良好,但对该答案的评论表明,如果引发异常,该答案将隐藏异常,并且由于GIL交互,它可能是不安全的。另外,我注意到没有办法杀死一个线程,这似乎表明如果进程永远不会完成,就有可能结束许多挂起的线程。或者即使它最终完成,它仍然使用现在无用的资源,因为结果永远不会被看到。

四处搜索,看起来基于multiprocessing库的解决方案更可取,使用与上面引用的答案相同的基本结构和用于回传到原始线程的队列。没有担心GIL问题(因为它是一个单独的进程),如果超时到期,我可以终止进程。所以我尝试了这个,只是遇到了另一个问题:把一些东西放在一个队列上,它必须是可以腌制的 - 并且从函数返回的项目不是。

所以,鉴于这种情况:

  • 在线程中运行
  • 返回值不可挑剔
  • 希望避免线程回答中出现的问题

是否有解决上述所有问题的解决方案?或者我只需要使用上面引用的线程答案,并忍受限制?

0 个答案:

没有答案