Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.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 on rails Rails线程不足_Ruby On Rails_Ruby_Multithreading_Memory Leaks_Rake - Fatal编程技术网

Ruby on rails Rails线程不足

Ruby on rails Rails线程不足,ruby-on-rails,ruby,multithreading,memory-leaks,rake,Ruby On Rails,Ruby,Multithreading,Memory Leaks,Rake,我目前正在开发一个IMAP服务,它从Gmail中提取用户电子邮件的滑动窗口,并出于性能原因将其存储在本地。传输、解码和存储电子邮件是可行的,但是通过IMAP IDLE命令空闲的线程在保持活力方面遇到了困难 会发生什么?线程通过运行rake任务启动,每个用户一个线程。这工作正常,如果IMAP空闲信号丢失、连接重置或线程死亡,我将重新启动有问题的线程。但代码似乎导致内存泄漏或其他原因,导致线程不足。换句话说,由于没有接收到IMAP IDLE信号,线程被成功地标识为死线程,但是当我尝试重新启动它们时,

我目前正在开发一个IMAP服务,它从Gmail中提取用户电子邮件的滑动窗口,并出于性能原因将其存储在本地。传输、解码和存储电子邮件是可行的,但是通过IMAP IDLE命令空闲的线程在保持活力方面遇到了困难

会发生什么?线程通过运行rake任务启动,每个用户一个线程。这工作正常,如果IMAP空闲信号丢失、连接重置或线程死亡,我将重新启动有问题的线程。但代码似乎导致内存泄漏或其他原因,导致线程不足。换句话说,由于没有接收到IMAP IDLE信号,线程被成功地标识为死线程,但是当我尝试重新启动它们时,线程不会自行执行

更具体地说,内存使用量在几天内从64 MiB增加到>300 MiB,这可能会导致线程不足。不过,我对此并不确定。在登台计算机上使用较少的线程(15个用户仅=15个线程,加上Ruby IMAP库中的15个额外线程)进行调试,并计算创建的对象时,只能识别出内存使用的微不足道的增加

因此,我的问题是……;)

  • 如何正确地调试它
  • Ruby是否存在线程不足问题?我们也尝试了JRuby,但没有效果
  • 还有其他人经历过或有其他人经历过类似的问题吗

这是一个长期的尝试,但如果您怀疑代码或某些库泄漏线程或内存,您可以尝试使用JRuby版本的应用程序。Plumber的主要目标是查找Java应用程序中的内存泄漏,但我们也有一些基于JVM的语言的成功案例。

不太清楚您的问题,但据我所知,任何平台都支持有限数量的线程。如果我们滥用线程,不仅在Ruby中,而且在Java中,线程饥饿将会到来。您使用ThreadPool管理线程吗?Ruby(MRI 1.9.x)中的线程仍然不是操作系统的本机线程。220个线程已经太多了吗?而且,只有在一天以上的完美工作之后才会发生这种情况。既然线程需要空闲,我如何使用线程池?