并行化 Python 代码
项目描述
并行化 Python 代码
parhugin提供以下功能:
目录
安装
-
使用 pip 安装
pip install git+https://github.com/kasra-hosseini/parhugin.git
-
从源代码安装 parhugin:
- 克隆parhugin源代码:
git clone https://github.com/kasra-hosseini/parhugin.git
- 安装parhugin:
cd /path/to/my/parhugin python setup.py install或者:
cd /path/to/my/parhugin pip install -v -e .
使用多处理并行运行一个或多个 Python 函数
在这种情况下,我们有:
- 一个或多个函数
- 要并行运行的作业列表,例如:
[
[func1, (arg1_1, arg2_1, arg3_1)],
[func1, (arg1_2, arg2_2, arg3_2)],
[func2, (...)],
...
]
⚠️ 如果一个函数只有一个参数,不要忘记将它添加到上面的列表中[func_one_arg, [arg1]]或[func_one_arg, (arg1,)]。
- 用户指定要并行运行的进程数。
parhugin通过在请求的进程数上按照 FIFO 分配作业来并行化。
示例 1
首先,我们导入parhugin并定义了两个简单的函数,叫做func1and func2。这些函数可以有不同数量的参数。
from parhugin import multiFunc
import time
# Define two simple functions, func1 and func2
# Note that functions can have different number of arguments
def func1(a, b, sleep=0.5, info="func1"):
print(f"start, {info} calculated {a+b}")
time.sleep(sleep)
print(f"end, {info}")
def func2(a, sleep=0.2, info="func2"):
print(f"start, {info} prints {a}")
time.sleep(sleep)
print(f"end, {info}")
接下来,我们指定要并行运行的进程数。如果作业是 CPU 密集型的,则这可以是处理器的数量。否则,您可以将其设置为任何其他值。
myproc = multiFunc(num_req_p=10)
现在,我们需要添加要并行运行的作业。有不同的方法可以做到这一点:
- 添加一个函数及其参数:
myproc.add_job(target_func=func1, target_args=(2, 3, 0.5, "func1"))
print(myproc)
同样,我们可以添加另一个函数:
myproc.add_job(target_func=func2, target_args=(10, 0.2, "func2"))
print(myproc)
- 创建工作列表:
list_jobs = []
for i in range(1, 20):
list_jobs.append([func2, (f"{i}", 0.2, "func2")])
# and then adding them to myproc
myproc.add_list_jobs(list_jobs)
print(myproc)
最后,在请求的进程数上运行作业:
myproc.run_jobs()
也可以通过以下方式更改输出的详细级别:
myproc.run_jobs(verbosity=2)
完整示例
示例 1
from parhugin import multiFunc
import time
# Define two simple functions, func1 and func2
# Note that functions can have different number of arguments
def func1(a, b, sleep=0.5, info="func1"):
print(f"start, {info} calculated {a+b}")
time.sleep(sleep)
print(f"end, {info}")
def func2(a, sleep=0.2, info="func2"):
print(f"start, {info} prints {a}")
time.sleep(sleep)
print(f"end, {info}")
myproc = multiFunc ( num_req_p = 10 )
myproc 。add_job ( target_func = func1 , target_args = ( 2 , 3 , 0.5 , "func1" ))
打印( myproc )
myproc.add_job(target_func=func2, target_args=(10, 0.2, "func2"))
print(myproc)
list_jobs = []
for i in range(1, 20):
list_jobs.append([func2, (f"{i}", 0.2, "func2")])
# and then adding them to myproc
myproc.add_list_jobs(list_jobs)
print(myproc)
myproc.run_jobs(verbosity=2)