使用 multiprocessing.dummy 的并行请求
parallel request using multiprocessing.dummy
我尝试 运行 使用 multiprocessing.dummy 并按进度报告并行获取请求。
from multiprocessing.dummy import Pool
from functools import partial
class Test(object):
def __init__(self):
self.count = 0
self.threads = 10
def callback(self, total, x):
self.count += 1
if self.count%100==0:
print("Working ({}/{}) cases processed.".format(self.count, total))
def do_async(self):
thread_pool = Pool(self.threads)#self.threads
input_list = link
callback = partial(self.callback, len(link))
tasks = [thread_pool.apply_async(get_data, (x,), callback=callback) for x in input_list]
return (task.get() for task in tasks)
start = time.time()
t = Test()
results = t.do_async()
end = time.time()`
运行结果-与非并行请求同时
由于称为全局解释器锁 (GIL) 的原因,CPython 本质上是单线程的。这意味着一次只能有一个线程 运行,即使有多个 CPU 核心可用。 multiprocessing.dummy
只是使用线程的包装器,所以这就是您没有获得加速的原因。
要获得多个 CPU 的好处,您必须使用 multiprocessing
本身。但是,根据发送和接收子流程的输入和输出数据的成本,存在开销。如果这样做的成本大于子流程完成的工作量,那么使用 multiprocessing
实际上会减慢您的程序。因此,在您的示例中,multiprocessing
可能不会提高速度。尤其如此,因为回调中的大部分工作都涉及打印到标准输出,池中的所有进程都必须同步以防止打印出垃圾。
我在 concurrent.futures 中找到了解决方案:
import concurrent.futures as futures
import datetime
import sys
results=[]
print("start", datetime.datetime.now().isoformat())
start =time.time()
with futures.ThreadPoolExecutor(max_workers=100) as executor:
fs = [executor.submit(get_data, url) for url in link]
for i, f in enumerate(futures.as_completed(fs)):
results.append(f.result())
if i%100==0:
sys.stdout.write("line nr: {} / {} \r".format(i, len(link)))
我尝试 运行 使用 multiprocessing.dummy 并按进度报告并行获取请求。
from multiprocessing.dummy import Pool
from functools import partial
class Test(object):
def __init__(self):
self.count = 0
self.threads = 10
def callback(self, total, x):
self.count += 1
if self.count%100==0:
print("Working ({}/{}) cases processed.".format(self.count, total))
def do_async(self):
thread_pool = Pool(self.threads)#self.threads
input_list = link
callback = partial(self.callback, len(link))
tasks = [thread_pool.apply_async(get_data, (x,), callback=callback) for x in input_list]
return (task.get() for task in tasks)
start = time.time()
t = Test()
results = t.do_async()
end = time.time()`
运行结果-与非并行请求同时
由于称为全局解释器锁 (GIL) 的原因,CPython 本质上是单线程的。这意味着一次只能有一个线程 运行,即使有多个 CPU 核心可用。 multiprocessing.dummy
只是使用线程的包装器,所以这就是您没有获得加速的原因。
要获得多个 CPU 的好处,您必须使用 multiprocessing
本身。但是,根据发送和接收子流程的输入和输出数据的成本,存在开销。如果这样做的成本大于子流程完成的工作量,那么使用 multiprocessing
实际上会减慢您的程序。因此,在您的示例中,multiprocessing
可能不会提高速度。尤其如此,因为回调中的大部分工作都涉及打印到标准输出,池中的所有进程都必须同步以防止打印出垃圾。
我在 concurrent.futures 中找到了解决方案:
import concurrent.futures as futures
import datetime
import sys
results=[]
print("start", datetime.datetime.now().isoformat())
start =time.time()
with futures.ThreadPoolExecutor(max_workers=100) as executor:
fs = [executor.submit(get_data, url) for url in link]
for i, f in enumerate(futures.as_completed(fs)):
results.append(f.result())
if i%100==0:
sys.stdout.write("line nr: {} / {} \r".format(i, len(link)))