美文网首页
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