julia 调用python库_julia distributed pmap pycall调用第三方包的多进程例子

【序言】

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

复杂的业务逻辑用多进程解决

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

凡是子进程中要执行的函数或者包,都要设置成 【@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

欢迎指正

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值