我已经构建了一个这样的 json 块:
data = {
"url" : "http://www.example.com/post",
"postdata" : [
{ "key1" : "value1" },
{ "key2" : "value2" },
{ "key3" : "value3" },
{ "key4" : "value4" },
{ "key5" : "value5" },
{ "key6" : "value6" }
]
}
我正在尝试将“postdata”中的每个块并行(例如 2 个池)发布到相同的“url”。我曾尝试使用 Faraday、Typhoeus 和 Parallel,但在这样做的过程中我还没有遇到一个正常运行的用例。
理想情况下,我想使用 Typhoeus::Hydra 或 Faraday,将 'data' 对象传递给它,并使用 data['url'] 作为端点汇集 data['postdata'],但我已经空了递。大多数情况下,我遇到了需要一个数据数组的情况,例如:
[
{ "url" : "http://...",
"data" : { "key1" : "value1" },
{ "url" : "http://...",
"data" : { "key2" : "value2" },
{ "url" : "http://...",
"data" : { "key3" : "value3" }
]
但我显然想避免这种重复。
最终目标:将潜在的 100 个 json 主体并行发布到同一个 url,一次通过有限的(比如 10 个)汇集。任何人都可以帮助引导我走上正确的道路吗?
免责声明:这是一个内部端点,所以没有恶意。
基于 tadman 的解决方案:
class BatchWrapper
def initialize(data, offset)
@data = data
@offset = offset
end
def as_json
@data['postdata'][@offset]
end
end
q = Queue.new
data['postdata'].each_index do |i|
q << BatchWrapper.new(data, i)
end
t = Thread.new do
n = q.size
n.times do |i|
value = q.pop
res = http.post(data['url'], value.as_json)
puts res
puts "consumed #{value.as_json}"
end
end
t.join