擅长:python、mysql、java
<p>在<a href="https://docs.python.org/3/library/multiprocessing.html" rel="noreferrer">multiprocessing</a>中,您可以利用多个CPU来分发计算。由于每个CPU并行运行,因此您可以有效地同时运行多个任务。您可能希望对<a href="https://en.wikipedia.org/wiki/CPU-bound" rel="noreferrer">CPU-bound</a>任务使用多处理。例如,试图计算一个庞大列表中所有元素的总和。如果您的机器有8个内核,您可以将列表“剪切”为8个较小的列表,并在单独的内核上分别计算每个列表的总和,然后将这些数字相加。这样做,您将获得~8倍的加速</p>
<p>在(multi)<a href="https://docs.python.org/3/library/threading.html" rel="noreferrer">threading</a>中,您不需要多个CPU。想象一下一个向web发送大量HTTP请求的程序。如果使用单线程程序,它会在每次请求时停止执行(阻塞),等待响应,然后在收到响应后继续。这里的问题是,在等待外部服务器执行任务时,您的CPU没有真正执行任务;同时,它本可以做一些有用的工作!解决方法是使用线程——您可以创建许多线程,每个线程负责从web请求一些内容。线程的好处在于,即使它们在一个CPU上运行,CPU也会不时地“冻结”一个线程的执行,并跳到另一个线程的执行(这称为上下文切换,它以不确定的间隔不断发生)。因此,如果您的任务是<a href="https://en.wikipedia.org/wiki/I/O_bound" rel="noreferrer">I/O bound</a>,请使用线程</p>
<p><a href="https://docs.python.org/3/library/asyncio.html" rel="noreferrer">asyncio</a>本质上是线程化,<strong>不是CPU,而是作为程序员(或实际上是您的应用程序)决定上下文切换发生的时间和地点。在Python中,您使用<code>await</code>关键字来挂起协同程序的执行(使用<code>async</code>关键字定义)</p>