Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous Elixir Phoenix-使用任务模块上载多个图像_Asynchronous_Elixir_Phoenix Framework - Fatal编程技术网

Asynchronous Elixir Phoenix-使用任务模块上载多个图像

Asynchronous Elixir Phoenix-使用任务模块上载多个图像,asynchronous,elixir,phoenix-framework,Asynchronous,Elixir,Phoenix Framework,这是我的第一个长生不老药/凤凰项目,到目前为止我很喜欢它。遗憾的是,我没有太多时间真正探索任务/并发或otp 我有一个表格,可以允许多达7个图像上传一次。我最初设置了同步上传的代码,一个接一个。我的下一次迭代是尝试并行运行这些程序,这可以在下面的upload\u many函数中看到 上传7 x 250kb图像所花费的总时间并没有因为我的重写而减少(~15秒),这显然表明我做错了什么 我真的很感激任何帮助或建议 defmodule MyApp.S3 do def上传\u许多(参数、键)都可以 op

这是我的第一个长生不老药/凤凰项目,到目前为止我很喜欢它。遗憾的是,我没有太多时间真正探索任务/并发或otp

我有一个表格,可以允许多达7个图像上传一次。我最初设置了同步上传的代码,一个接一个。我的下一次迭代是尝试并行运行这些程序,这可以在下面的
upload\u many
函数中看到

上传7 x 250kb图像所花费的总时间并没有因为我的重写而减少(~15秒),这显然表明我做错了什么

我真的很感激任何帮助或建议

defmodule MyApp.S3 do
def上传\u许多(参数、键)都可以
ops=[max_并发:System.schedulers_online()*3,超时:20000]
钥匙
#[{“passport\u image\u url”,文件},{“drivers\u license\u url”,文件2},…]
|>Task.async_流(&upload/1,ops)
|>枚举到_列表()
结束
def上载({url_key,image_params})是否执行
唯一文件名=获取唯一文件名(图像参数.filename)
case File.read(图像参数路径)do
{:错误,{}->
{:错误,url_键,“无法读取文件”}
{:好的,图像\二进制文件}->
#返回图像url字符串或错误
res=put\u对象(唯一的\u文件名、图像\u二进制)
IO.inspect url\u键
Tuple.insert_at(res,1,url_键)
#{:好的,url\u键,url}
结束
结束
def get_unique_文件名(文件名)do
文件_uuid=uuid.uuid4(:十六进制)
图像\文件名=文件名
“#{file_uuid}-#{image_filename}”
结束
def put_对象(唯一,图像_二进制)do
bucket=System.get_env(“bucket_NAME”)
res=ExAws.S3.put\u对象(bucket、unique、image\u二进制)
|>ExAws.request!
案例研究
%{状态\ U代码:200}->
{:好的,图像\ url(唯一,bucket)}
_ ->
{:错误,“上传到S3时出错”}
结束
结束
def图像_url(唯一,存储桶)do
“https://{bucket}.s3.amazonaws.com/{bucket}/{unique}”
结束
结束
我编写了一个测试,上载了7个图像,并使用
Process.sleep(4000);%{状态代码:200}
。使用4秒钟的模拟,它可以在4秒钟内同时执行7个任务,但是如果我删除模拟并真正上传文件,它又需要15秒钟左右的时间。以下是测试:

test“使用许多文件上载更新startpack”,%%{conn:conn,user:user}do
startpack=Repo.insert!%Startpack{user_id:user.id}
image_upload=%Plug.upload{path:“test/fixtures/foxy.png”,文件名:“foxy.png”}
#多字段的可能解决方案
图像=%{
“护照图片”=>图片上传,
“车辆保险图片”=>图片上传,
“盒子租赁图片”=>图片上传,
“设备租用图片”=>图片上传,
“p45_图像”=>图像上传,
“计划信图片”=>图片上传,
“借出公司证书图片”=>图片上传
}
valid=Map.merge(@valid\u attrs,images)
使用模拟考试,[请求!:fn()->
进程睡眠(4000)
%{状态代码:200}
结束]做
conn=put conn,启动包路径(conn,:更新,启动包),启动包:有效
断言重定向到(conn)=开始包路径(conn,:显示,开始包)
startpack=Repo.get_by(startpack,用户id:user.id)
断言startpack.passport\u url
结束
结束

在做了一些研究之后,我开始怀疑我是否只是在最大限度地利用上传功能(带宽?),而代码实际上很好。15-18秒似乎是一个很长的时间上传7个小图片,所以我不确定。如果是这样的话,同时运行上传有什么好处吗?我在某个地方读到,当运行多个线程时,您将开始看到好处。。我不确定这是否适用于这里。值得注意的是,我已经在Heroku上部署并手动测试过,但上面仍然发布了类似的时间。我不熟悉
ExAws
,但它似乎在下面使用
:hackney
。Hackney有一个连接池的概念。也许你可以看看ExAws是如何设置hackney并试图篡改池设置的?试着关掉它或增加连接数。谢谢@瓶颈,我会试着看一看。你认为瓶颈是我正在使用的东西而不是我无法控制的东西吗?例如,互联网连接??当然,可能是这样。为了测试这一理论(即你的线路已经饱和),你可以尝试1)在heroku上部署你的代码并上传到aws(如果互联网连接有问题,那么应该很快),或者2)使用你以前的语言编写一个具有相同语义的解决方案(即并行上传),其行为应该相同(15秒完成)