【序言】
简单的逻辑使用多线程解决,开销比较小(本文不讨论多线程,只讨论多进程)
复杂的业务逻辑用多进程解决
在使用多线程多进程的时候,遇到异常的时候,会报很多看不懂的错误,建议增加代码的健壮性,随时捕捉异常。可以提前用单进程进行大量的调试工作。
凡是子进程中要执行的函数或者包,都要设置成 【@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
欢迎指正
网友评论