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 如何更改我的OS X并使其尽可能多的线程?_Ruby_Multithreading_Macos - Fatal编程技术网

Ruby 如何更改我的OS X并使其尽可能多的线程?

Ruby 如何更改我的OS X并使其尽可能多的线程?,ruby,multithreading,macos,Ruby,Multithreading,Macos,OSX在线程方面似乎有一些限制,请查看以下内容: 我一直在尝试将ruby与负责根据需要打开尽可能多的TCPs线程的系统一起使用,为了在ruby中重现问题,我使用了以下代码: 10000.times { |n| p n; Thread.new { sleep 60 } } 当我运行上面的代码时,在打印出大约2022个线程后,我一直遇到这个错误: ThreadError: unable to create new native thread initialize at org/jruby/R

OSX在线程方面似乎有一些限制,请查看以下内容:

我一直在尝试将ruby与负责根据需要打开尽可能多的TCPs线程的系统一起使用,为了在ruby中重现问题,我使用了以下代码:

10000.times { |n| p n; Thread.new { sleep  60 } }
当我运行上面的代码时,在打印出大约2022个线程后,我一直遇到这个错误:

ThreadError: unable to create new native thread
  initialize at org/jruby/RubyThread.java:382
         new at org/jruby/RubyThread.java:301
      (root) at main.rb:1
       times at org/jruby/RubyFixnum.java:273
      (root) at main.rb:1
Jruby实现就是这样,但所有其他实现都是一样的,实际上它与ruby本身无关,就像如果你对cpp做同样的事情,你会面临同样的问题:

#include <pthread.h>
#include <stdio.h>
#include <ulimit.h>

void thread_main(void *ptr)
{
  sleep(60);
}

int main()
{
  int i;
  pthread_t threads[10000];

  for(i = 0; i < 10000; i++) {
    printf("%d\n", i);
    if(pthread_create(threads + i, NULL, (void *)thread_main, NULL) != 0) {
      perror("thread test");
      exit(1);
    }
  }
}
有并没有办法最大化线程的数量来使用所有的资源

有并没有办法最大化线程的数量来使用所有的资源

改变你的设计。10000个物理线程只是在浪费资源——它将消耗大量内存,并花费几乎所有的时间切换上下文

将程序限制为16个线程作为起点,并以不同的方式处理问题。通过这种方式,您的程序将获得更多的CPU时间读取:它将比使用1000多个线程快很多倍。如果要满足您的请求,如OP中所示,在问题上抛出更多线程只会使您的系统缓慢爬行-请参阅并行减速

另请参见OSX

有并没有办法最大化线程的数量来使用所有的资源

改变你的设计。10000个物理线程只是在浪费资源——它将消耗大量内存,并花费几乎所有的时间切换上下文

将程序限制为16个线程作为起点,并以不同的方式处理问题。通过这种方式,您的程序将获得更多的CPU时间读取:它将比使用1000多个线程快很多倍。如果要满足您的请求,如OP中所示,在问题上抛出更多线程只会使您的系统缓慢爬行-请参阅并行减速


另请参见OS X。

我没有其他选择,只能使用其他一些语言,如erlang,它具有映射进程的外部调度功能。我使用的是epoll not select,所以上下文切换不应该是主要问题,我不想使用10k线程来获得更好的性能,我的服务器应该作为一个主处理程序,通过xmpp与不同的社交网络进行通信,所以不能像16个线程那样使用,我使用线程是因为它比生成进程便宜。但毕竟,我需要为每个TCP连接使用一个线程/进程,我希望系统使用全部可用资源,我试图更改ulimit,但没有运气,在ubuntu的情况下,当没有可用资源时,系统将停止创建线程,我应该如何使用操作系统来实现这一点X@EkiEqbal将数组传递给epoll,而不是为每个文件描述符创建一个线程,然后从每个线程中生成一个文件描述符:另外,OSX没有epoll。它有投票和投票。所以,我仍然没有看到需要超过16个线程。我没有其他选择,除了使用一些其他语言,如erlang,它有它的出调度映射进程。我使用的是epoll not select,所以上下文切换不应该是主要问题,我不想使用10k线程来获得更好的性能,我的服务器应该作为一个主处理程序,通过xmpp与不同的社交网络进行通信,所以不能像16个线程那样使用,我使用线程是因为它比生成进程便宜。但毕竟,我需要为每个TCP连接使用一个线程/进程,我希望系统使用全部可用资源,我试图更改ulimit,但没有运气,在ubuntu的情况下,当没有可用资源时,系统将停止创建线程,我应该如何使用操作系统来实现这一点X@EkiEqbal将数组传递给epoll,而不是为每个文件描述符创建一个线程,然后从每个线程中生成一个文件描述符:另外,OSX没有epoll。它有投票和投票。所以,我仍然不认为需要超过16个线程。