Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
如何在Ruby中向池的每个线程传递特定值?_Ruby_Multithreading_Threadpool - Fatal编程技术网

如何在Ruby中向池的每个线程传递特定值?

如何在Ruby中向池的每个线程传递特定值?,ruby,multithreading,threadpool,Ruby,Multithreading,Threadpool,免责声明:我在编码方面很糟糕,而且不是以英语为母语的人 在下面的代码段中,当order=4时,将在生成新的cCycle时调用check方法。put currCyclein check方法打印01 2 4 9 3 6 13 10 5 11 7 15,但当我在线程的getData方法中打印相同内容时,它打印1 13 9 13 5 11 7 15。我不完全清楚为什么会发生这种情况 我需要每个线程对传递给它的currCycle值执行一些操作 我已经尝试克隆/复制currCycle对象,这样每个线程都可以

免责声明:我在编码方面很糟糕,而且不是以英语为母语的人

在下面的代码段中,当order=4时,将在生成新的cCycle时调用check方法。
put currCycle
in check方法打印01 2 4 9 3 6 13 10 5 11 7 15,但当我在线程的getData方法中打印相同内容时,它打印1 13 9 13 5 11 7 15。我不完全清楚为什么会发生这种情况

我需要每个线程对传递给它的
currCycle
值执行一些操作

我已经尝试克隆/复制currCycle对象,这样每个线程都可以处理一个特定的值,而不是多个线程处理同一个值并跳过几个。(我猜这与共享内存或竞争条件有关)

我正在做一个个人研究项目,这个项目产生了一个新的结果。例如,Debrijn(order=4)将产生000010101111。如果您一次从左到右遍历4位,并在到达末尾时从开头追加位,则此序列包含0000到1111的所有可能的4位子序列(循环序列)。{0000,0001,0010,…,11111101011001000}


生成该序列的算法在每次迭代中生成长度为1、2或4的字符串(cCycle),如1、10或1011。因为我使用的是更高的顺序(order=128+,sequenceLength=2**order),所以保存整个序列是不切实际和不必要的。

如果您使用的是线程,绝对不希望涉及全局变量。在Ruby中,这些问题的前缀是
$
,在普通代码中可能会导致相当大的问题,但这些问题会随着线程的增加而放大。在任何情况下,您也不希望将全局变量指定为方法参数。注意:Ruby是一种区分大小写的语言,大写字母在语法上有特定的含义。变量和方法名称应为小写字母。大写字母表示形式为
ClassName
CONSTANT\u NAME
的常量。为什么首先需要线程?你有CPU限制吗?如果是这样的话,在普通Ruby下,这一点都没有帮助。您需要使用不带GVL的Ruby来有效地利用多个线程,如在TruffleRuby或JRuby中。请记住,对于线程,任何类型的共享可变数据都是非常有问题的,需要互斥锁才能正确同步。我的基本需求是处理在getData方法中大量转换的数十亿>128位二进制字符串,并与postgres数据库交互。因为De Bruijn算法一次生成128个字符串,所以我想同时运行这些转换。我并没有嫁给线程本身。这就是我开始的地方。我愿意接受建议。将您关于全局变量的注释视为方法参数,我的实际代码并没有这样做。我只是在这里动态编辑了这个问题的代码。没有人会读我真正的代码,永远不会。但是,谢谢。对于A,B,我一定会调查的。信不信由你,我的第一个版本的代码是C++。由于库的原因,我转而使用ruby。当我在getData中提到转换时,它们严重依赖于多个外部库(OpenSSL、PostgreSQL等)。为了让他们一起工作,我真的抓狂了,最后改用了Ruby(因为我对Ruby有着丰富的经验)。我将重新考虑C++或可能签出朱丽亚及其库。谢谢你抽出时间。谢谢。
require 'thread/pool'

$cycle = ""
$order = 4

def debruijn($order)
  # ....
  loop {
    #....
    # cCycle values in each iteration {0, 0001, 0011, 01, 0111, 1}
    check(cCycle)
    #....
  }
  # ....
end

def check(cCycle)
  $cycle = $cycle + cCycle # append cCycle to left over subsequence from previous iteration
  pool = Thread.pool(1,8)
  while $cycle.length >= $order do
    # Get first n (=order) bits from cycle
    currCycle = $cycle[0...$order].to_i(2).to_s # binary string to integer string 
    # pop the first char from cycle
    $cycle = $cycle[1..-1]
    puts currCycle
    pool.process {
      getData(currCycle)
    }
  end
  while !pool.done? do
    sleep(2)
  end
  pool.shutdown
end

def getData(currCycle)
  puts currCycle
  # perform operations on currCycle
end
# ....