<1),太长了,读不下去了;
<p>如果您使用的是3.2+,请使用<a href="http://docs.python.org/3/library/concurrent.futures.html" rel="nofollow">^{<cd1>}</a>,如果您使用的是2.x版本,则使用PyPI上的<a href="https://pypi.python.org/pypi/futures" rel="nofollow">^{<cd2>}</a>模块,该模块会反向移植相同的东西</p>
<p>您可以用<a href="http://docs.python.org/3/library/concurrent.futures.html#threadpoolexecutor-example" rel="nofollow">^{<cd3>}</a>编写代码,并将其转换为<a href="http://docs.python.org/3/library/concurrent.futures.html#processpoolexecutor" rel="nofollow">^{<cd4>}</a>,这是一行代码更改。而且API非常简单,没有什么可以混淆的。在</p>
<hr/>
<blockquote>
<p>Also requiring the commands to do things asynchronously is not an option since I want the bot to be easily extensible.</p>
</blockquote>
<p>我不明白这是怎么回事。异步代码的可扩展性并不差。当然,为了扩展异步代码,您必须知道如何编写异步代码,但是成千上万的初级JS程序员每天都在做一项几乎可以通过的工作,Python使它变得更加容易(参见<a href="https://github.com/saucelabs/monocle" rel="nofollow">^{<cd5>}</a>,<a href="http://twistedmatrix.com/documents/8.1.0/api/twisted.internet.defer.html#inlineCallbacks" rel="nofollow">^{<cd6>}</a>in <code>twisted</code>,<code>tulip</code>等)。另外,你在描述中明确地把这些事情称为“回调”,这意味着你已经在用这些术语思考了</p>
<p>如果您确信这实际上是一个需求,那么<code>twisted</code>是不可接受的。但是<a href="http://gevent.org/intro.html" rel="nofollow">^{<cd10>}</a>(和<code>eventlet</code>等)可能只是编写看起来完全同步的代码,并且它是异步运行的。在</p>
<p>下一步:</p>
<blockquote>
<p>What module do you recommend for running several of these callbacks in parallel and why?</p>
</blockquote>
<p>你真的需要并行运行它们吗(你可以利用多个内核同时运行多个CPU绑定的作业)、并发(一个长时间运行的作业不会阻塞其他作业),还是两者都不需要(只要这些作业完成,它们是并行的、交错的还是序列化的都无关紧要)?在</p>
<p>如果需要并行,则需要<code>multiprocessing</code>。真的没有办法解决这个问题;GIL将阻止您在一个进程中使用多个核心。在</p>
<p>如果只需要并发,可以使用<code>threading</code>或{<cd12>}。进程可能意味着在Windows和Unix之间(甚至有时在Unix之间)可能意味着更大的开销和/或更大的可移植性问题,有时它会迫使您考虑如何传递数据,或者,如果必须的话,共享数据。另一方面,通过<em>而不是</em>强迫您考虑传递或共享数据,线程使意外创建争用和其他错误变得更容易。(关于权衡的更多信息,请参阅isedev的伟大答案。)</p>
<p>如果两者都不需要,可以使用<code>gevent</code>(或类似的东西)、<code>threading</code>或{<cd12>}。您可以创建10000个绿色线程并在它们之间切换,就像创建几百个线程或进程一样简单,而且开销要少得多。但是,一个长时间运行的CPU绑定命令可能会使整个系统停滞。在</p>
<hr/>
<p>无论使用哪种方法,您都很可能希望使用一个greenlet、线程或进程池从队列中拉出命令(而不是为每个命令派生一个新的命令,或者构建更复杂的命令)。在</p>
<p>虽然<code>multiprocessing</code>内置了这样的东西,<code>threading</code>没有。(实际上,<em>是基于<code>threading</code>的线程池,但它在<code>multiprocessing</code>中,而不是{<cd13>}。而且它不是公共API的一部分。)</p>
<p>在<code>multiprocessing</code>中有很多非常酷的东西,如果你需要,一定要用它。(也有一些第三方库,里面有更酷的东西,可以让复杂的用例变得更简单,或者做一些<code>multiprocessing</code>做不到的事情。)但是如果不是,那么<code>futures</code>就简单得多,用线程和进程测试同一个系统的能力是非常强大的(或者甚至在运行时做的很简单)不错。在</p>