我应该使用fork还是thread?

时间:2010-03-20 12:07:22

标签: python coding-style

在我的脚本中,我有一个函数foo ,基本上使用 pynotify 在15分钟的时间间隔后反复通知用户。

def foo:
    while True:
        """Does something"""
        time.sleep(900)

我的主要脚本必须与用户&做所有其他的事情所以我不能调用foo()函数。直接

  

更好的方法是什么以及为什么?   使用fork还是thread?

5 个答案:

答案 0 :(得分:9)

我不会告诉你使用哪一个,但这里有一些优点:

线程可以比进程更快地启动,线程使用的操作系统资源比进程少,包括内存,文件句柄等。线程还为您提供了通过共享变量进行通信的选项(尽管很多)会说这不是一个优势而不是优势 - 见下文。

进程每个都有自己独立的内存和变量,这意味着进程通常通过相互发送消息进行通信。 这比通过共享内存进行线程通信更容易正确进程也可以真正同时运行,这样如果你有多个CPU内核,你可以保留所有他们忙于使用流程。在Python * 中,global interpreter lock可以防止线程多次使用多个核心。


* - 也就是CPython,如果你去http://python.org并下载Python就可以获得Python的实现。其他Python实现(例如Jython)不一定禁止Python同时在多个CPU上运行线程。感谢@EOL的澄清。

答案 1 :(得分:4)

对于这些类型的问题,线程和分叉进程似乎都不是正确的方法。如果你想做的就是每15分钟通知用户一次,为什么不使用像GLib或Twisted反应堆这样的事件循环呢?这使您可以安排应该偶尔运行一次的操作,并继续执行其余的程序。

答案 2 :(得分:4)

使用多个进程可以同时利用多个CPU内核,而在CPython中,使用线程不会(线程轮流使用单个CPU内核) - 所以,如果你有CPU密集型工作并且绝对需要要使用线程,你应该考虑Jython或IronPython;使用CPython,这种考虑通常足以影响对multiprocessing模块的选择,远离threading模块(它们提供非常相似的接口,因为multiprocessing设计为易于放入代替threading)。

对于这个至关重要的考虑因素,线程可能通常是Windows上的一个更好的选择(性能方面)(制作新流程是一项繁重的任务),但在Unix变体上更少(Linux,BSD版本,OpenSolaris,MacOSX) ,...),因为在那里制作新流程的速度更快(但是如果你使用的是IronPython或Jython,你应该在你关心的平台上检查这仍然适用于有问题的虚拟机 - CLR with用于IronPython的.NET或Mono,是Jython的首选JVM。)

答案 3 :(得分:3)

流程要简单得多。只需将它们松开,让操作系统处理它。

此外,流程通常更有效率。进程不共享公共I / O资源池;他们是完全独立的。

Python的subprocess.Popen处理所有事情。

答案 4 :(得分:1)

如果用fork表示os.fork,那么我会避免使用它。它不是跨平台和太低级别 - 您需要自己在流程之间实现通信。

如果要使用单独的进程,则使用子进程模块,或者如果您使用的是Python 2.6或更高版本的新multiprocessing模块。这与线程模块的API非常相似,因此您可以开始使用线程然后轻松切换到进程,反之亦然。

对于你想要做的事情,我想我会使用线程,除非"""does something"""是CPU密集型的,并且你想利用多个核心,我在这种特殊情况下对此表示怀疑。