我到处搜索,我找不到任何使用多线程迭代循环的简单示例。
例如,我怎样才能多线程化这个循环?
for item in range(0, 1000):
print item
有没有办法像4个线程一样削减它,所以每个线程有250次迭代?
答案 0 :(得分:8)
最简单的方法是使用multiprocessing.dummy(使用线程而不是进程)和Pool
import multiprocessing.dummy as mp
def do_print(s):
print s
if __name__=="__main__":
p=mp.Pool(4)
p.map(do_print,range(0,10)) # range(0,1000) if you want to replicate your example
p.close()
p.join()
如果你想更好地利用多个CPU,也许你想要尝试真正的多处理,但是有几个警告并且随后会有guidelines。
Pool
的其他方法可能更适合您的需求 - 取决于您实际上要做的事情。
答案 1 :(得分:7)
您必须手动进行拆分:
https://www.example.com/path?paramnameone=valueone¶mnametwo=valuetwo
此代码使用多线程,这意味着所有内容都将在单个Python进程中运行(即只启动一个Python解释器)。
多处理,在另一个答案中讨论,意味着在几个Python解释器中运行一些代码(在几个进程中,而不是线程)。这可能会利用所有可用的CPU内核,因此当您专注于代码的速度(打印大量数字直到终端讨厌您!)时,这非常有用,而不是仅仅是并行处理。 1
1。 import threading
def ThFun(start, stop):
for item in range(start, stop):
print item
for n in range(0, 1000, 100):
stop = n + 100 if n + 100 <= 1000 else 1000
threading.Thread(target = ThFun, args = (n, stop)).start()
原来是a wrapper around the threading
module。 multiprocessing.dummy
和multiprocessing
具有相同的接口,但第一个模块使用进程进行并行处理,而后者 - 使用线程。功能
答案 2 :(得分:1)
自 Python 3.2 起,concurrent.futures
standard library 为 concurrently map
a function across iterables 提供原语。由于 map
和 for
密切相关,因此可以轻松地将 for
循环转换为多线程/多处理循环:
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor() as executor:
executor.map(print, range(0, 1000))