Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我应该用叉子还是线?_Python_Coding Style - Fatal编程技术网

Python 我应该用叉子还是线?

Python 我应该用叉子还是线?,python,coding-style,Python,Coding Style,在我的脚本中,我有一个函数foo,它基本上使用pynotify在一个时间间隔(比如15分钟)后反复通知用户一些事情 def foo: while True: """Does something""" time.sleep(900) 我的主脚本必须与用户交互&做所有其他事情,所以我不能调用foo()函数。直接的 做这件事的更好方法是什么?为什么? 用叉子还是线 过程要简单得多。只要松开它们,让操作系统来处理 此外,流程通常效率更高。进程不共享公共I/O资源

在我的脚本中,我有一个函数foo,它基本上使用pynotify在一个时间间隔(比如15分钟)后反复通知用户一些事情

def foo:
    while True:
        """Does something"""
        time.sleep(900)
我的主脚本必须与用户交互&做所有其他事情,所以我不能调用foo()函数。直接的

做这件事的更好方法是什么?为什么? 用叉子还是线


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

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


Python的
子进程.Popen
处理所有事情。

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

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


对于您想要做的事情,我想我会使用线程,除非
“做某事”
是CPU密集型的,并且您希望利用多个内核,我对此表示怀疑。

我不会告诉您使用哪个内核,但以下是每个内核的一些优点:

线程启动速度比进程快,线程使用的操作系统资源比进程少,包括内存、文件句柄等。线程还提供了通过共享变量进行通信的选项(尽管许多人会说这与其说是优点,不如说是缺点-见下文)

进程每个进程都有各自独立的内存和变量,这意味着进程通常通过相互发送消息进行通信。这比让线程通过共享内存进行通信要容易得多。进程也可以真正并发地运行,因此,如果您有多个CPU核,那么您可以让所有CPU核都忙于使用进程。在Python*中,防止线程多使用一个内核



*-也就是说,CPython,它是Python的实现,如果您转到并下载Python,就会得到它。其他Python实现(例如)不一定禁止Python在多个CPU上同时运行线程。感谢@EOL的澄清。

对于这类问题,线程和分叉进程似乎都不是正确的方法。如果您只想每15分钟通知用户一次,为什么不使用GLib's或Twisted's reactor之类的事件循环呢?这允许您计划应该偶尔运行一次的操作,并继续执行程序的其余部分。

使用多个进程可以同时利用多个CPU核心,而在CPython中,使用线程不会(线程轮流使用单个CPU核心)--因此,如果你有CPU密集型的工作,并且绝对想使用线程,你应该考虑Jython或IrPython;对于CPython,这种考虑通常足以左右对
多处理
模块的选择,而不是
线程
模块(它们提供非常相似的接口,因为
多处理
设计成可以轻松地代替
线程


考虑到这一关键因素,在Windows上(创建新进程是一项繁重的任务),线程通常是一个更好的选择(性能方面),但在Unix变体(Linux、BSD版本、OpenSolaris、MacOSX等)上则不太常见,因为在Windows上创建新进程的速度更快(但如果您使用的是IronPython或Jython,那么您应该在您关心的平台上检查这一点是否仍然适用于所讨论的虚拟机——使用.NET或Mono for IronPython的CLR,Jython选择的JVM)。

Hmm两个相互矛盾的答案…@Kenny TM:不足为奇。“更好”在这个问题上是没有定义的。而且,对于大多数“更好”的定义来说,这是很有争议的。如果我有CPU密集型,那么我应该选择哪一个?为什么?+1来自我-S。洛特比我权威得多,尤其是在Python方面。我是一个初学者,所以我不知道如何实现它。但是,你的答案似乎很有说服力……我使用线程bcos,任务不是CPU密集型的,而且我也没有使用fork作为它的slower来实际创建一个全新的PCB。您可能是指“在CPython中,全局解释器锁…”。事实上,在其他一些Python实现(Jython、Iron Python等)中没有GIL@EOL-没错。我假设发问者使用的是CPython,因为人们通常会指定他们是否使用了CPython以外的任何东西。不过,我想说的是-我会更新我的答案。