我正在使用python 2.7。我正在使用多线程。现在如果一个线程再次死亡,我再次创建一个来补偿它。因此,我应该手动创建大量线程并将它们存储在 中,并在或更多的现有线程死亡,或者我应该创建一个时,一些线程死亡??
哪个更有效?我应该先创建线程以节省时间吗?
0
A
回答
2
当你说一个线程“死亡”时,你的意思是你有意终止它还是因为错误而失败?
如果你有意终止它,并且担心产生新线程所需的时间,为什么不保持线程持久化并简单地让它执行新线程会完成的工作?这是一个非常标准的方法 - 维护一个“工作者”线程池,并有一个工作队列用于执行待处理项目。它们都运行一个完全相同的循环,即从队列中取出一个项目并执行它。这些项目可以是包含要执行的代码的方法的对象,如果这种方式很方便 - 如果任务都非常相似,那么代码可以更容易地放入线程自己的函数中。
如果你在谈论由于错误导致的线程故障,我不会想到这是常见的,足以担心它。如果是这样,你可能需要考虑让代码更健壮。
在任何情况下,在大多数系统上产生一个线程应该是一个轻量级活动 - 比产生一个全新进程更轻量化,例如。因此,我真的不用担心会留下一堆线索用于储备 - 这对我来说确实听起来像是早期的优化。
即使产卵线程速度很慢,请考虑通过提前产生线程来执行什么操作 - 您将占用更多内存(操作系统中的某些内存用于跟踪线程,某些内存用于Python中的对象它用来跟踪线程),虽然不是很多;你也会在创建所有这些线程的程序开始时花费更多时间。所以,当你跑步的时候,你可能会节省一点时间,但是你的程序需要更长的时间才能开始。对我来说这听起来不像是一个明智的取舍,除非你的代码的速度和延迟在运行时是绝对关键的,而且如果速度非常关键,那么我不确定纯粹的Python解决方案是否是正确的方法。像C/C++这样的东西会给你更好的时间安排控制,但代价是更复杂。
总结:严肃地说,不要担心它,只需根据需要产生线程即可。相信我,代码中的其他地方会出现更大的速度问题,这些问题更值得你花时间。
相关问题
- 1. Scala - 在创建对象时节省创建时间
- 2. 我应该创建多少个线程?
- 3. 为什么我的JAVA线程池不节省时间?
- 4. 我应该在EDT中创建的线程中调用InvokeLater吗?
- 5. 如何为我的模型创建一个Html.EditorFor以节省时间?
- 6. 创建以线性时间
- 7. 节省空间的线索
- 8. 我可以更改先前创建的matplotlib FuncAnimation的时间间隔吗?
- 9. 我应该在MySQL中使用SMALLINT而不是DATETIME来节省空间吗?
- 10. 我应该创建使用Workflow Foundation建模的长时间运行的线程吗?
- 11. 实体框架+自我跟踪实体应该为我节省时间
- 12. Python - 线程 - 我可以创建线程队列列表吗?
- 13. 我可以在主线程(UI线程)之外创建UI吗?
- 14. Python在多线程时节省执行时间
- 15. 我应该使用Redux创建我的ReactNative应用程序吗?
- 16. 我应该在移动网站中嵌入CSS和JS以节省带宽吗?
- 17. 节省时间间隔
- 18. 当我抛出异常时,我应该省略else语句吗?
- 19. 在自己创建的多个线程中执行核心数据操作以节省处理时间
- 20. 创建线程以运行长时间工作但未响应
- 21. 我应该创建子类NSManagedObject吗?
- 22. 我应该创建此访问器吗?
- 23. 我应该为此创建索引吗?
- 24. 我应该创建一个新表吗?
- 25. 我应该为模块创建DLL吗?
- 26. 我应该创建另一个表吗?
- 27. 我们应该处理异常,同时节省了enitity
- 28. 你应该在Java中创建无限数量的线程吗?
- 29. 我应该在哪里创建我的线程? (Objective-C)
- 30. 用动态数字创建“时间节省”计算器
@No它死了,因为它自己的idon't没有它的一些例外 –
@感谢很多这样的详细解释:)真正有用的欢呼! –
当然,不客气。你知道你总是可以捕捉异常,对吧?所以你可以有一个外部循环,比如说,将工作项目从队列中取出并在'try ... except'块中调用它们。如果这是一个长期运行的守护进程,那么你可以记录异常(总是使用长时间运行的守护进程记录!),然后继续下一个项目。即使你不想处理异常(这是一个偏好问题),我仍然会推荐至少捕捉,记录和重新提升它们。有些东西比不记录的守护进程更烦人。 (^_^) – Cartroo