我应该使用线程还是进程?

3

我正在树莓派上用Python编写代码。

while(true):
  functionA
  functionB

Function A 是一个捕获png格式图像的命令。我不希望它成为一个阻塞函数,而是希望在代码执行function B的同时,function A能够捕获图像并准备好下一次运行所需的数据。

我很困惑是否应该使用线程或进程。

如果必须使用线程,那么它什么时候会停止? 当function A完成执行后它会立即停止吗?在这种情况下,每次启动此线程时,我需要调用start方法吗? 或者我应该使用进程,那么何时进程会停止呢?


使用线程,而不是进程。 - Asclepius
让我们明确线程和进程之间的区别。非正式定义:线程是作为进程的一部分执行的代码序列;一个进程可以包含许多线程,它们都共享相同的进程空间和虚拟内存空间。线程将在完成后结束(并终止自身),而不一定会结束父进程。从听起来的样子,您应该使用线程同步地执行函数A。新进程肯定会占用更多资源。 - h0r53
2个回答

2
让我们清楚地了解线程和进程之间的区别。一个非正式的定义:线程是作为进程的一部分执行的代码序列;进程可能包含许多线程,它们共享相同的进程空间和虚拟内存空间。线程将在完成后结束(并且自行终止),而不一定会结束父进程。根据听起来的情况,您应该使用线程同步执行functionA。新进程肯定需要更多的资源,听起来很不必要。此外,如果您需要在线程完全完成执行后再次执行该代码,则需要重新创建线程。另一方面,如果这种方法对您正在执行的任务合适,您可以以无限循环的方式编写在新线程中执行的代码。

1
他可以在 while 循环中执行函数,这样他就不必再创建线程了。 - Asclepius
没错,你不一定需要重新创建线程,除非它完全执行完毕。但是,这取决于线程的控制流程。 - h0r53
1
@ CaitLan Jenner 我想使用的是这样的代码 def Mythread():,然后在 while loop 中添加 Mythread.start(),这样每次都会创建一个新的线程。 - Shravan Singh
1
请注意,在CPython中,由于全局解释器锁定(Global Interpreter Lock),每次只能有一个线程执行Python字节码。因此,“functionA”和“functionB”并不真正并行运行。“functionB”可以在“functionA”释放GIL后运行,例如正在进行I/O操作。 - Roland Smith

2
CaitLAN的回答遗漏了几个重要细节:
1) 进程间通信比线程间通信要难得多。线程都存在于同一地址空间中,因此它们之间的通信就像线程A写入一个变量,线程B读取它那样简单。
进程与其他进程之间通过共享管道、共享文件、网络连接或操作系统提供的其他手段进行通信。如果想在进程间传递对象,你(或你使用的框架)需要提供"编组"和"解组"(也称为"串行化"、"pickling"...)对象的方法。
2) 你可以安全地杀死一个进程。但是,你永远无法确定是否可以杀死一个线程。如果你的函数A有可能出问题,那么如果它在程序内部的线程中运行,那么整个程序可能会崩溃,但如果函数A作为独立的Python进程运行,则你的程序可能可以恢复。
(以上注释仅供参考,请勿翻译)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接