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

Python 我应该使用线程还是进程?,python,multithreading,python-2.7,raspberry-pi,multiprocessing,Python,Multithreading,Python 2.7,Raspberry Pi,Multiprocessing,我正在用python在raspberry pi上编写代码 while(true): functionA functionB 函数A基本上是一个以png格式捕获图像的命令。我不希望它是一个阻塞函数。我希望我的代码继续执行函数B,同时函数A捕获图像并为下一次运行做好数据准备 我不知道是使用线程还是进程 如果我必须使用线程,它什么时候停止? 函数A完成执行后,它会停止一次吗?在这种情况下,我需要在每次启动这个线程时调用start方法? 或者我应该使用一个进程以及如何使用它,也就是说进程何时停

我正在用python在raspberry pi上编写代码

while(true):
  functionA
  functionB
函数A基本上是一个以png格式捕获图像的命令。我不希望它是一个阻塞函数。我希望我的代码继续执行函数B,同时函数A捕获图像并为下一次运行做好数据准备

我不知道是使用线程还是进程

如果我必须使用线程,它什么时候停止? 函数A完成执行后,它会停止一次吗?在这种情况下,我需要在每次启动这个线程时调用start方法?
或者我应该使用一个进程以及如何使用它,也就是说进程何时停止。

让我们明确线程和进程之间的区别。非正式定义:线程是作为进程一部分执行的代码序列;一个进程可能包含多个线程,这些线程共享相同的进程空间和虚拟内存空间。线程将在完成时结束(并自行终止),而不必结束父进程。听上去,您应该使用线程来同步执行function。一个新的过程肯定会占用更多的资源,听起来不必要。此外,如果需要在线程完全完成执行后再次执行该代码,则需要再次创建线程。另一方面,如果这种方法适合您正在执行的任务,那么您可以以无限循环的方式编写在新线程中执行的代码。

CaitLAN的回答省略了几个重要细节:

1) 进程之间的通信比线程之间的通信困难得多。线程都生活在相同的地址空间中,因此它们之间的通信几乎就像线程A写变量,线程B读变量一样简单

进程通过共享管道、共享文件、网络连接或操作系统提供的其他方式彼此通信。如果您想在进程之间传递对象,则需要您(或您使用的某个框架)提供对对象进行“编组”和“解编组”(也称为“序列化”、“酸洗”)的方法

*有一个魔鬼潜伏在“几乎”,它比我想在这里描述的更复杂。谷歌“线程同步”和/或“内存可见性”

2) 您可以安全地终止进程。你永远无法确定是否要杀死一根线。如果您的functionA有可能脱离深层,那么如果它在程序中的线程中运行,它可能会关闭整个程序,但是如果functionA作为单独的Python进程运行,您的程序可能会恢复

*同样,在这个空间里写的东西太多了


使用线程,而不是进程。让我们明确线程和进程之间的区别。非正式定义:线程是作为进程一部分执行的代码序列;一个进程可能包含多个线程,这些线程共享相同的进程空间和虚拟内存空间。线程将在完成时结束(并自行终止),而不必结束父进程。听上去,您应该使用线程来同步执行function。一个新的进程肯定会占用更多的资源。他可以在
while
循环中执行函数,因此他不必再次创建线程。没错,除非线程完全完成执行,否则不必再次创建线程。但是,这取决于线程的控制流。@CaitLan Jenner我想使用的是这样的
def Mythread():
,然后在
while循环中添加
Mythread.start()
,这样每次它都会创建一个新线程请记住,在CPython中,一次只能有一个线程执行Python字节码(因为全局解释器锁)。所以
function
functionB
并不是真正并行运行的<当
function
已释放GIL(例如正在执行I/O)时,代码>功能B
可以运行。