<p>在您的示例中,<code>target=incr()</code>在没有传递参数的情况下尝试在主线程中运行<code>incr</code>会失败(即使它成功了,当它尝试启动以<code>None</code>作为<code>target</code>的线程时,它也不会做任何事情;<code>None</code>是<code>incr</code>隐式返回的内容)。使用<code>target=incr</code>运行将按预期在线程中执行递增操作。你知道吗</p>
<p>使用<code>target=incr()</code>的情况是使用闭包来避免污染全局范围。例如,在Python 3中,可以执行以下操作:</p>
<pre><code>def incr():
counter = 0
def incr_inner(num):
nonlocal counter
count = 0
for i in range(1000):
counter += 1
print("\nWorker: {}, Counter: {}, Self-count: {} .".format(num, counter, count))
print(counter)
return incr_inner
</code></pre>
<p>它将创建一个不在<code>global</code>范围内共享的每线程<code>counter</code>;通过设置<code>target=incr()</code>,它将调用外部<code>incr</code>,并返回封闭函数<code>incr_inner</code>作为实<code>target</code>,并带有自己唯一的<code>counter</code>变量。你知道吗</p>
<p>作为闭包的嵌套主要是关于实现隐藏和简洁性(它并不总是如您所希望的那样工作;在python2中,如果没有<code>nonlocal</code>关键字,就不能让它像编写的那样运行,而没有一些黑客技术)。但是您可以在任何版本的Python中从类生成<code>callable</code>对象,并获得大致相同的“有状态线程”行为。例如:</p>
<pre><code>class incr(object):
def __init__(self):
self.counter = 0
def __call__(self, num):
count = 0
for i in range(1000):
self.counter += 1
print("\nWorker: {}, Counter: {}, Self-count: {} .".format(num, self.counter, count))
print(self.counter)
</code></pre>
<p>就像闭包一样,这个<code>class</code>可以用作参数,当作为<code>target=incr()</code>传递时,它为每个线程保持独立的<code>counter</code>。你知道吗</p>