擅长:python、mysql、java
<p>这是一个很大的话题,但这里有一些建议。在</p>
<ul>
<li>把线程看作是共享相同地址空间并可以访问相同内存的进程。通信是由共享变量完成的。多个线程可以在同一进程中运行。在</li>
<li>进程(在这个上下文中,粗略地说)有它们自己的私有数据,如果两个进程想要通信,那么通信必须更明确地进行。在</li>
<li>当您在编写一个瓶颈是CPU周期的程序时,线程或进程都不会给您在单核机器上的加速。在</li>
<li>进程和线程对于多任务处理(在(子)程序之间快速切换)仍然是有用的——这是您的操作系统所做的,因为它运行的进程远远多于内核。在</li>
<li>进程和线程(甚至是协同进程!)如果您正在执行的任务是I/O绑定的,那么即使在单核机器上也可以给您带来相当大的加速—比如从网络中获取数据。例如,另一个进程或线程可以启动下一个网络操作,而不是主动等待数据的发送或到达。在</li>
<li>当不需要显式封装时,线程比进程更可取,因为它们的开销较低。对于大多数与CPU相关的并发问题,特别是“<a href="https://en.wikipedia.org/wiki/Embarrassingly_parallel" rel="noreferrer">embarassingly parallel</a>”问题的大子集,生成的进程多于处理器是没有意义的。在</li>
<li>pythongil防止同一进程中的两个线程并行运行,即多个内核同时执行指令。在</li>
<li>因此,Python中的线程对于加速CPU绑定的任务相对无用,但是对于I/O绑定的任务仍然非常有用,因为阻塞操作(例如等待网络数据)释放GIL,使得另一个线程可以在其他线程等待时运行。在</li>
<li>如果您有多个处理器,您可以通过生成多个进程来实现真正的并行性,尽管GIL很复杂。这只对CPU受限的任务是值得的,而且通常您必须考虑生成进程的开销和进程之间的通信开销。在</li>
</ul>