Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/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
Threadpool jruby并发池线程在组合以获得结果时混合在一起_Threadpool_Jruby - Fatal编程技术网

Threadpool jruby并发池线程在组合以获得结果时混合在一起

Threadpool jruby并发池线程在组合以获得结果时混合在一起,threadpool,jruby,Threadpool,Jruby,有一个索引为[[0,n_0],[1,n_1],…,[n,n_n]]的数组。对于每个n_i调用一个函数。在每个线程终止后,有必要按第一个组件对来自线程的结果重新排序。就我所能找到的方法而言,我组织索引是硬编码的,通过询问索引是否为例如0,然后分别为硬编码索引0启动代码。到目前为止,这是一种可行的方法(尽管代码看起来好像有人不理解循环的用途) 但现在有一种奇怪的行为: 索引0和1的计算是准确的,但当1的结果添加一行后,前一个函数的结果将被添加(再次) 情况并非总是如此,因此这取决于结果的出现顺序。

有一个索引为[[0,n_0],[1,n_1],…,[n,n_n]]的数组。对于每个n_i调用一个函数。在每个线程终止后,有必要按第一个组件对来自线程的结果重新排序。就我所能找到的方法而言,我组织索引是硬编码的,通过询问索引是否为例如0,然后分别为硬编码索引0启动代码。到目前为止,这是一种可行的方法(尽管代码看起来好像有人不理解循环的用途)

但现在有一种奇怪的行为: 索引0和1的计算是准确的,但当1的结果添加一行后,前一个函数的结果将被添加(再次)

情况并非总是如此,因此这取决于结果的出现顺序。 例如,如果索引0的计算在索引1的计算之后完成,则idx 1缺失或错误。但也出现了其他混淆结果的情况:idx 1之前的idx 0,但idx 0的结果是idx 1的结果

?


看起来,如果线程没有真正分开。这是可以强制执行的,还是有一种更聪明的方法来保持索引?

我发现,一种方法是同步线程,但这会使算法再次变慢,因此更好的解决方案是:

如果rest元组已经具有区分输入结果的结构,则结果不会混淆:

rest = [[], []]
tpl.each do |idx, vn|
    if idx == 0
        pool.post do
            res = funk(vn)
p ['idx 0: ', res]
            rest[0] << [0, res]
        end#pool.post
    elsif idx == 1
        pool.post do
            res = funk(vn)
p ['idx 1: ', res]
            rest[1] << [1, res]
        end#pool.post
end;end
rest=[],[]
第三方物流每一个都有| idx,vn|
如果idx==0
pool.post do
res=funk(vn)
p['idx 0:',res]
其余[0]
["idx 1: ", [4]]
["idx 0: ", [16900]]
rest: [[0, [16900]], [1, [16900], ...]
rest = [[], []]
tpl.each do |idx, vn|
    if idx == 0
        pool.post do
            res = funk(vn)
p ['idx 0: ', res]
            rest[0] << [0, res]
        end#pool.post
    elsif idx == 1
        pool.post do
            res = funk(vn)
p ['idx 1: ', res]
            rest[1] << [1, res]
        end#pool.post
end;end