Ian*_*Ian 6 python multithreading
我是线程新手,并且想知道为各种任务(在服务器环境中)产生大量线程是否不好.与更线性的编程相比,线程占用更多的内存/ CPU吗?
ebo*_*ebo 18
如果要使用多个线程,则必须考虑多个事项:
我从中得出的结论:
由于您是线程新手,因此还有其他值得注意的事项 - 我更倾向于将其视为值的并行范围.
对于任何给定对象的传统线性/顺序编程,您只有一个线程访问和更改一段数据.由于具有词法范围,这通常是安全的.具体而言,一个函数可以对变量的值进行操作,而不会影响全局值.如果您没有词法范围或不良的词法范围,那么在一个函数中更改名为"foo"的变量的值会影响另一个名为"foo"的变量.现在这种问题不太常见,但仍然很常见,可以提及.
使用线程,您可以以更微妙的方式处理相同的问题.虽然你仍然有词汇范围帮助你 - 因为一个函数内的局部值"X"独立于另一个函数中称为"X"的另一个本地值,数据结构是可变的这一事实是线程中错误的主要来源.
具体来说,如果函数传递了一个可变值,那么在线程环境中除非你已经注意,否则该函数不能保证该值不被其他任何东西改变.
这种共享状态是线程系统中大约90-99%的错误的来源,并且可能非常难以调试.因此,如果您要编写一个线程系统,您应该记住共享值的行进距离 - 即并行访问的范围.
为了限制bug,你可以使用一些已知可行的选项:
1最相当于unix管道.图3在逻辑上等同于版本控制,并且通常被称为软件事务存储器.
1和3是Kamaelia支持的并发模式,旨在消除由2级引起的错误.(披露,我运行Kamaelia项目)2不受支持,因为它依赖于"始终使一切正确".
无论你使用哪种方法来解决你的问题,牢记这个问题,以及处理它的方法,以及预先计划你打算如何处理它将为你节省下来的麻烦.
这取决于平台。
Windows 线程在创建时必须提交大约 1MB 的内存。拥有某种线程池比像疯子一样生成线程更好,以确保您永远不会分配超过固定数量的线程。此外,当您使用 Python 工作时,您会受到全局解释器锁的影响,这会阻碍依赖大量并发线程的代码。
在 Unix 上,您可以考虑使用不同的进程而不是线程,或者查看其他异步处理方式(Twisted 服务器框架有处理异步网络任务的有趣方法,如果您真的喜欢冒险,可以看看 stackless Python ,一个根本不真正使用内核线程的延续框架)。
| 归档时间: |
|
| 查看次数: |
2713 次 |
| 最近记录: |