from multiprocessing import Pool
from time import perf_counter as now
import numpy as np
def make_func():
n = 20000
np.random.seed(7)
M = np.random.rand(n, n)
return lambda x, y: M[x, x] + M[y, y]
class ParallelProcessor:
def __init__(self):
pass
def process_task(self, args):
"""Unpack arguments internally"""
index, integer_arg = args
print(f(index, integer_arg))
def run_parallel(self, tasks, num_cores=None):
"""Simplified parallel execution without partial"""
num_cores = num_cores
task_args = [(idx, val) for idx, val in enumerate(tasks)]
start = now()
global f
f = make_func()
print(f"************** {now() - start} seconds to make f")
start = now()
with Pool(num_cores) as pool:
results = pool.map( self.process_task, task_args)
print(f"************** {now() - start} seconds to run all jobs")
return results
if __name__ == "__main__":
processor = ParallelProcessor()
processor.run_parallel(tasks=[1, 2, 3, 4, 5], num_cores=2)
Я объявил f глобальным. Я думаю, что это означает, что в каждом работнике будет сделана копия большого массива Numpy.
from multiprocessing import Pool
from time import perf_counter as now
import time
import os
import numpy as np
def make_func():
n = 20000
np.random.seed(7)
M = np.random.rand(n, n)
return lambda x, y: M[x, x] + M[y, y]
def init_worker():
global f
f = make_func()
class ParallelProcessor:
def __init__(self):
pass
def process_task(self, args):
"""Unpack arguments internally"""
index, integer_arg = args
print(f(index, integer_arg))
def run_parallel(self, tasks, num_cores=None):
"""Parallel execution with proper initialization"""
num_cores = num_cores or len(os.sched_getaffinity(0))
task_args = [(idx, val) for idx, val in enumerate(tasks)]
start = now()
with Pool(num_cores, initializer=init_worker) as pool:
results = pool.map(self.process_task, task_args)
print(f"************** {now() - start} seconds to run all jobs")
return results
if __name__ == "__main__":
processor = ParallelProcessor()
processor.run_parallel(tasks=[1, 2, 3, 4, 5], num_cores=2)
< /code>
Мне сказали, что это лучший стиль, но я не вижу, что такое преимущество. Я не уверен, почему f
должен быть объявлен глобальным в `init_worker. В любом случае копия большого массива Numpy все еще отправляется каждому работнику. В целом это также кажется медленнее. < /P>
Я использую Linux. < /P>
В идеале я хотел бы не делать Копия массива у каждого работника. Есть ли быстрый способ использовать общую память, чтобы избежать этого?
task_args = [(idx, val) for idx, val in enumerate(tasks)] start = now() global f f = make_func() print(f"************** {now() - start} seconds to make f") start = now() with Pool(num_cores) as pool: results = pool.map( self.process_task, task_args) print(f"************** {now() - start} seconds to run all jobs") return results
if __name__ == "__main__": processor = ParallelProcessor() processor.run_parallel(tasks=[1, 2, 3, 4, 5], num_cores=2) [/code] Я объявил f глобальным. Я думаю, что это означает, что в каждом работнике будет сделана копия большого массива Numpy.[code]from multiprocessing import Pool from time import perf_counter as now import time import os import numpy as np
def make_func(): n = 20000 np.random.seed(7) M = np.random.rand(n, n) return lambda x, y: M[x, x] + M[y, y]
def run_parallel(self, tasks, num_cores=None): """Parallel execution with proper initialization""" num_cores = num_cores or len(os.sched_getaffinity(0)) task_args = [(idx, val) for idx, val in enumerate(tasks)]
start = now() with Pool(num_cores, initializer=init_worker) as pool: results = pool.map(self.process_task, task_args) print(f"************** {now() - start} seconds to run all jobs") return results
if __name__ == "__main__": processor = ParallelProcessor() processor.run_parallel(tasks=[1, 2, 3, 4, 5], num_cores=2) < /code> Мне сказали, что это лучший стиль, но я не вижу, что такое преимущество. Я не уверен, почему f [/code] должен быть объявлен глобальным в `init_worker. В любом случае копия большого массива Numpy все еще отправляется каждому работнику. В целом это также кажется медленнее. < /P> Я использую Linux. < /P>
В идеале я хотел бы не делать Копия массива у каждого работника. Есть ли быстрый способ использовать общую память, чтобы избежать этого?
Согласно примеру архитектуры Goggles, они используют модель представления в качестве входной переменной для Composable.
@OptIn(ExperimentalLifecycleComposeApi::class)
@Composable
fun TaskDetailScreen(
onEditTask: (String) -> Unit,
onBack: () ->...