可变线程数
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))
但请注意,在这种情况下,您需要在进程数和范围之间进行竞争。如果你想要所有 a
s 并且只需要所有 b
s,请尝试使用 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() 方法产生的。
我想同时拥有可变数量的线程运行。 我测试了来自 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))
但请注意,在这种情况下,您需要在进程数和范围之间进行竞争。如果你想要所有 a
s 并且只需要所有 b
s,请尝试使用 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() 方法产生的。