在我的脚本中,我有一个函数foo ,基本上使用 pynotify 在15分钟的时间间隔后反复通知用户。
def foo:
while True:
"""Does something"""
time.sleep(900)
我的主要脚本必须与用户&做所有其他的事情所以我不能调用foo()函数。直接
更好的方法是什么以及为什么? 使用fork还是thread?
答案 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密集型的,并且你想利用多个核心,我在这种特殊情况下对此表示怀疑。