如何解决python中多处理作业生成器的区别
我需要使用不同的输入参数运行相同的函数,这将花费很长时间,但幸运的是我知道它只需要 1 个 CPU 内核,所以我决定在 python 中使用多处理器包并行运行它们。假设我的 CPU 中有 4 个内核,并且我有 8 个不同的参数要尝试,因此我认为以下代码的时间成本将是运行单个作业的时间成本的 2 倍:
from multiprocessing import Pool
def a_hard_work(parameter):
#do some time-cost work with parameter as input
class IterableAdapter:
"""https://stackoverflow.com/a/39564774"""
def __init__(self,iterable_factory,length=None):
self.iterable_factory = iterable_factory
self.length = length
def __iter__(self):
return iter(self.iterable_factory())
def loader(param_set):
def loader():
for param in param_set:
yield param
return IterableAdapter( lambda: loader() )
def worker(parameter):
a_hard_work(parameter)
if __name__ == "__main__":
param_set = [1,2,3,4,5,6,7,8]
tasks = loader(param_set)
with Pool() as p:
for i in p.imap_unordered(worker,tasks):
try:
pass
except Exception as e:
print(e)
然而它花费的时间比我排除的要长得多,所以我检查了我的 CPU 的使用情况,我发现在这个脚本运行期间只有 1 个 CPU 核心被使用,所有其他 3 个核心都没有负载。
然后我将代码更改为以下内容:(我认为应该相同):
from multiprocessing import Pool
def a_hard_work(parameter):
#do some time-cost work with parameter as input
def loader(param_set):
for param in param_set:
yield param
def worker(parameter):
a_hard_work(parameter)
if __name__ == "__main__":
param_set = [1,tasks):
try:
pass
except Exception as e:
print(e)
这次脚本按照我的例外运行,但是我生成作业的两种方式有什么区别?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。