美文网首页
julia distributed pmap pycall调用第

julia distributed pmap pycall调用第

作者: 昵称违法 | 来源:发表于2020-09-12 15:06 被阅读0次

【序言】

简单的逻辑使用多线程解决,开销比较小(本文不讨论多线程,只讨论多进程)
复杂的业务逻辑用多进程解决

在使用多线程多进程的时候,遇到异常的时候,会报很多看不懂的错误,建议增加代码的健壮性,随时捕捉异常。可以提前用单进程进行大量的调试工作。

凡是子进程中要执行的函数或者包,都要设置成 【@everywhere】——子进程中可见可用

1、自定义的函数,前面加上@everywhere宏
2、julia的using包,在using前面加上@everywhere
3、pycall的包:@everywhere 别名 = pyimport("python的包名")
4、对子进程的管理,只能在主进程中进行

一、引用distributed包,在主进程中创建新的进程

using Distributed
process = addprocs(4) # 不设置数量的话,系统自己取环境变量设置的进程数

[out]

4-element Array{Int64,1}:
 2
 3
 4
 5

二、调用python math的例子

using Distributed
@everywhere using PyCall
@everywhere math =  pyimport("math")
pmap(math.sin, range(0, stop=pi, length=100))

[out]

100-element Array{Float64,1}:
 0.0
 0.03172793349806765
 0.0634239196565645
 0.09505604330418266
 0.12659245357374926
 0.1580013959733499
 0.1892512443604102
 0.2203105327865406
 0.2511479871810792
 0.28173255684142967
 0.3120334456984871
 0.3420201433256687
 0.3716624556603275
 ⋮
 0.3420201433256689
 0.31203344569848734
 0.28173255684142967
 0.2511479871810793
 0.2203105327865408
 0.1892512443604105
 0.1580013959733499
 0.12659245357374938
 0.09505604330418288
 0.06342391965656484
 0.031727933498067656
 1.2246467991473532e-16

三、调用python中talib包的例子

把pycall进来的包设置成 everywhere的方式:

@everywhere 别名 = pyimport("包的名字")
比如

@everywhere np =  pyimport("numpy") 

[完整的小例子]

@everywhere talib =  pyimport("talib") 

@everywhere function fn(ary)
    talib.MA(ary,5)
end

pmap(fn,[rand(20),rand(20)])

[out]

2-element Array{Array{Float64,1},1}:
 [NaN, NaN, NaN, NaN, 0.1969260624185635, 0.14189523075487376, 0.1687074395874896, 0.28051355960272245, 0.33594709681596097, 0.4169282385338218, 0.5098245450283768, 0.5421634363787392, 0.44374033757086984, 0.35314558969752313, 0.42141012226332586, 0.43497219982046953, 0.4794308462859629, 0.632615077598777, 0.7283703476973254, 0.7446519256374067]
 [NaN, NaN, NaN, NaN, 0.4683143551771286, 0.4655195650050835, 0.5338052504303024, 0.5964215079581532, 0.6114147465402535, 0.6978473773705007, 0.6100714510326141, 0.58432561497111, 0.5556806115649426, 0.41776095340398, 0.25491075809654345, 0.3819792482491003, 0.46578417236438996, 0.4360010565859618, 0.5434700452224549, 0.6331941796279723]

四、多进程的管理:创建、查看、销毁等

using Distributed
process = addprocs(4) #增加进程,指定增加的数量,不指定则按照默认的参数创建

[out]
4-element Array{Int64,1}:
 6
 7
 8
 9

nprocs() # 进程的数量
[out]
5

procs() #获取所有进程
[out]
5-element Array{Int64,1}:
 1
 6
 7
 8
 9

nworkers() #工作进程的数量,不包含主进程。
[out]
4

myid()     #本进程(当前进程)的id
[out]
1

rmprocs(workers()) #杀死工作进程,只能杀死子进程

#有子进程的时候,杀死子进程
[out]
Task (done) @0x0000000017b2f3d0
#只有主进程的时候,不能杀死主进程
[out]
Warning: rmprocs: process 1 not removed

更多参考资料:julia分布式计算

欢迎指正

相关文章

网友评论

      本文标题:julia distributed pmap pycall调用第

      本文链接:https://www.haomeiwen.com/subject/rajwektx.html