2013-07-02 45 views
0

我正在使用python 2.7。我正在使用多线程。现在如果一个线程再次死亡,我再次创建一个来补偿它。因此,我应该手动创建大量线程并将它们存储在 中,并在或更多的现有线程死亡,或者我应该创建一个时,一些线程死亡??
哪个更有效?我应该先创建线程以节省时间吗?

回答

2

当你说一个线程“死亡”时,你的意思是你有意终止它还是因为错误而失败?

如果你有意终止它,并且担心产生新线程所需的时间,为什么不保持线程持久化并简单地让它执行新线程会完成的工作?这是一个非常标准的方法 - 维护一个“工作者”线程池,并有一个工作队列用于执行待处理项目。它们都运行一个完全相同的循环,即从队列中取出一个项目并执行它。这些项目可以是包含要执行的代码的方法的对象,如果这种方式很方便 - 如果任务都非常相似,那么代码可以更容易地放入线程自己的函数中。

如果你在谈论由于错误导致的线程故障,我不会想到这是常见的,足以担心它。如果是这样,你可能需要考虑让代码更健壮。

在任何情况下,在大多数系统上产生一个线程应该是一个轻量级活动 - 比产生一个全新进程更轻量化,例如。因此,我真的不用担心会留下一堆线索用于储备 - 这对我来说确实听起来像是早期的优化。

即使产卵线程速度很慢,请考虑通过提前产生线程来执行什么操作 - 您将占用更多内存(操作系统中的某些内存用于跟踪线程,某些内存用于Python中的对象它用来跟踪线程),虽然不是很多;你也会在创建所有这些线程的程序开始时花费更多时间。所以,当你跑步的时候,你可能会节省一点时间,但是你的程序需要更长的时间才能开始。对我来说这听起来不像是一个明智的取舍,除非你的代码的速度和延迟在运行时是绝对关键的,而且如果速度非常关键,那么我不确定纯粹的Python解决方案是否是正确的方法。像C/C++这样的东西会给你更好的时间安排控制,但代价是更复杂。

总结:严肃地说,不要担心它,只需根据需要产生线程即可。相信我,代码中的其他地方会出现更大的速度问题,这些问题更值得你花时间。

+0

@No它死了,因为它自己的idon't没有它的一些例外 –

+0

@感谢很多这样的详细解释:)真正有用的欢呼! –

+0

当然,不客气。你知道你总是可以捕捉异常,对吧?所以你可以有一个外部循环,比如说,将工作项目从队列中取出并在'try ... except'块中调用它们。如果这是一个长期运行的守护进程,那么你可以记录异常(总是使用长时间运行的守护进程记录!),然后继续下一个项目。即使你不想处理异常(这是一个偏好问题),我仍然会推荐至少捕捉,记录和重新提升它们。有些东西比不记录的守护进程更烦人。 (^_^) – Cartroo

相关问题