我有一个线程从容器中获取每个元素并向数据库发送上传请求。上传是同步完成的。
容器中的元素是金融合约,它们可能有也可能没有与之关联的数据结构调用 ticktable。
现在,对于那些有 ticktable 的合约,我必须进行两次上传。 1)首先将ticktable上传到db。 db 返回一个 id。 2) 将id附加到契约(Contract)上,然后上传契约(Contract)。
因此,例如,如果我循环遍历包含 100 个合约的容器,假设其中 30 个具有 ticktable,其余 70 个没有。
我想弄清楚 std::future 或 std::shared_future 是否适合这样的任务?
我尝试通过将 future 与 30 个合约中的每一个相关联并使用 launch:async 策略调用 std::async 来实现。因此,在循环的第一遍中,启动了 3o 个线程,并将返回的 future “移动”到与合约关联的容器中。 其他 70 份契约(Contract)只是以通常的方式上传。
在第二遍中,我希望对存储的 future 调用get()。如果请求完成,获取id并用它完成合约上传。这可能行不通,因为我认为将 future 转移到容器会分离线程。
请问我应该采用哪种方法来实现我想要的行为?
最佳答案
移动 future 会导致其状态移动到目标。所以不,你没有你认为的问题。
您的 ticktable 解决方案看起来像是 future 的 future ——一种 future 用于 ticktable 上传,一种用于契约(Contract)上传。但从某种意义上说, future 的 future 就是 future 。
因此,一种方法是将 future 的 future 折叠成 future 。
假设您有一个契约(Contract)类型 Contract (我假设它是一个伪规则类型)。绑定(bind)你的 ticktable id 是一个 function<void(Contract&)> 类型的操作.有趣的是,这样的操作也可以是 noop。
所以有一个std::future<void(Contract&)> Contract::PrepareForUpload() const .对于您要上传的每份契约(Contract),请上传。
有一个 ticktable 的返回一个 std::async生成 future拥有一个线程。
那些没有 ticktable 的返回一个延迟的 std::async包含一个 noop []{return [](auto&&...){};}工厂。
接下来,添加 std::future<void> Contract::Upload(std::function<void(Contract&>) const ,它会运行准备代码然后进行上传(为什么要在此处执行此操作?我稍后会展示)。
现在上传的操作是:
auto prep = contract.PrepareForUpload();
auto upload = contract.Upload(prep.get());
现在这有点烦人。做两件事?恶心。
为什么不为我们做呢?
std::future<void> Contract::Upload() const {
return std::async(
std::launch::async,
[this]{
auto prep = contract.PrepareForUpload();
return contract.Upload(prep.get());
}
);
}
现在Contract::Upload自动为您准备和上传。
然而,这会在 ticktable 情况下启动 2 个线程。所以写一个同步PrepareForUpload可以在“组合”中调用 Upload案例。
如果PrepareForUpload需要额外的参数,我们可以将它们传递给 Upload .
可能有一些您没有涉及的细节可能会使这个过程变得更复杂,但是对 future 链的正确答案通常是将链条折叠成一个 future 。
C++1z 有关于 .then 的建议和类似的功能,以使这种链崩溃变得简单和高效。
关于c++ - std::future 或 std::shared_future 等待多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37373564/
这似乎应该有一个直截了当的答案,但在Google上花了很多时间,所以我找不到它。这可能是缺少正确关键字的情况。在我的RoR应用程序中,我有几个模型共享一种特定类型的字符串属性,该属性具有特殊验证和其他功能。我能想到的最接近的类似示例是表示URL的字符串。这会导致模型中出现大量重复(甚至单元测试中会出现更多重复),但我不确定如何让它更DRY。我能想到几个可能的方向...按照“validates_url_format_of”插件,但这只会让验证干给这个特殊的字符串它自己的模型,但这看起来很像重溶液为这个特殊的字符串创建一个ruby类,但是我如何得到ActiveRecord关联这个类模型
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我正在使用RubyonRails3.2.2,我想从我的模型/类中“提取”一些方法。也就是说,在不止一个类/模型中,我有一些方法(注意:方法与用户授权相关,并被命名为“CRUD方式”),这些方法实际上是相同的;所以我认为DRY方法是将这些方法放在“共享”模块或类似的东西中。实现该目标的常见且正确的方法是什么?例如,我应该将“共享”代码放在哪里(在哪些目录和文件中)?如何在我的类/模型中包含提到的方法?你有什么建议?注意:我正在寻找“RubyonRails制作东西的方式”。 最佳答案 一种流行的方法是使用ActiveSupport关注点
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我正在尝试使用ruby编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?
我是ruby的新手,我认为重新构建一个我用C#编写的简单聊天程序是个好主意。我正在使用Ruby2.0.0MRI(Matz的Ruby实现)。问题是我想在服务器运行时为简单的服务器命令提供I/O。这是从示例中获取的服务器。我添加了使用gets()获取输入的命令方法。我希望此方法在后台作为线程运行,但该线程正在阻塞另一个线程。require'socket'#Getsocketsfromstdlibserver=TCPServer.open(2000)#Sockettolistenonport2000defcommandsx=1whilex==1exitProgram=gets.chomp
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
我有一个使用PDFKit呈现网页的pdf版本的Rails应用程序。我使用Thin作为开发服务器。问题是当我处于开发模式时。当我使用“bundleexecrailss”启动我的服务器并尝试呈现任何PDF时,整个过程会陷入僵局,因为当您呈现PDF时,会向服务器请求一些额外的资源,如图像和css,看起来只有一个线程.如何配置Rails开发服务器以运行多个工作线程?非常感谢。 最佳答案 我找到的最简单的解决方案是unicorn.geminstallunicorn创建一个unicorn.conf:worker_processes3然后使用它: