可变线程数

variable number of threads

我想同时拥有可变数量的线程运行。 我测试了来自 multiprocessing 的多个多线程示例,但它们不会同时 运行。 为了更好地解释这里的一个例子:

from multiprocessing import Pool

def f(x):
   print("a",x)
   time.sleep(1)
   print("b",x)

if __name__ == '__main__':
   with Pool(3) as p:
       for i in range(5):
           p.map(f, [i])

结果:

a 0
b 0
a 1
b 1
a 2
b 2

这里它先等待 1 秒,然后再等待 b,但我希望先打印所有 a,然后再打印 b(每个线程 运行s 同时打印,这样结果看起来像这样:

a0
a1
a2
b0
b1
b2

首先,这不是 threads 池,而是 processes 池。如果你想要线程,你需要使用 multiprocessing.dummy.

其次,您似乎误解了 map 方法。最重要的是,它是阻塞。您每次都使用单个编号列表调用它 - [i]。所以你实际上并没有使用 Pool 的权力。您只使用一个过程,等待它完成,然后继续下一个数字。要获得所需的输出,您应该改为:

if __name__ == '__main__':
    with Pool(3) as p:
        p.map(f, range(5))

但请注意,在这种情况下,您需要在进程数和范围之间进行竞争。如果你想要所有 as 并且只需要所有 bs,请尝试使用 Pool(5).

您提到了线程,但似乎在使用进程。线程模块使用线程,多处理模块使用进程。主要区别在于线程 运行 在同一内存 space 中,而进程具有单独的内存。如果您正在寻找使用流程库。尝试使用以下代码片段。

from multiprocessing import Process
import time

def f(x):
   print("a",x)
   time.sleep(1)
   print("b",x)

if __name__ == '__main__':
   for i in range(5):
       p =  Process(target=f, args=(i,))
       p.start()

进程是通过创建 Process 对象然后调用其 start() 方法产生的。