问题标签 [green-threads]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - 为什么绿色线程不能在多核上工作
在维基百科上:Green_threads被描述为通常不能在多核上运行而没有解释原因。
在多核处理器上,本机线程实现可以自动将工作分配给多个处理器,而绿色线程实现通常不能。
我了解操作系统可以将本机线程分配给多核。有人可以解释为什么绿色线程不能在多核上运行吗?是因为绿色线程是从本机线程派生/产生的,它们不能从本机线程移动到另一个线程吗?
python - 如何设计我的 python 应用程序以跨多核并行工作
据我所知,在 Python 中,如果您在多核环境中使用普通线程,GIL 通常会运行并以负面的方式影响性能(因为线程会不断尝试获取和释放 GIL 并执行线程/处理器之间的大量上下文切换)。
这就是为什么很多人开始使用绿色线程,例如 eventlet。eventlet 库允许您让多个绿色线程协同工作并在单个处理器中完美工作(更少的同步问题、快速生成/效率等)。
我的问题是,如果我有一个多核操作系统并且要设计我的 python 应用程序,我应该遵循什么最佳实践或设计模式来利用协作线程(绿色线程)和多核处理器。
javascript - 调用多个 Web 服务 - Node.js 与绿色线程
我的网络服务器必须调用 3-4 个网络服务。我打算在 Node.js 中实现它,但我正在考虑 gevent,因为我不是回调代码的忠实粉丝。我知道绿色线程在行为上与操作系统线程相似,每个线程在调用下一个之前都会等待一个 Web 服务的响应。这个对吗?
例如,如果我正在调用 Web 服务 A、B、C、D,每个需要 1 秒,节点将在 1 秒内完成所有 4 个(由于并行调用),但 gevent 将需要 4 秒(因为它一个接一个地把它们锁起来)。
ruby-on-rails - Phusion Passenger process pool explained
I am trying to understand exactly how requests to a rails application get processed with Phusion Passenger. I have read through the Passenger docs (found here: http://www.modrails.com/documentation/Architectural%20overview.html#_phusion_passenger_architecture) and I understand how they maintain copies of the rails framework and your application code in memory so that every request to the application doesn't get bogged down by spinning up another instance of your application. What I don't understand is how these separate application instances share the native ruby process on my linux machine. I have been doing some research and here is what I think is happening:
One request hits the web server which dispatches Passenger to fulfill the request on one of Passenger's idle worker processes. Another request comes in almost simultaneously and is handled by yet another idle Passenger worker process.
At this point there are two requests being executed which are being managed by two different Passenger worker processes. Passenger creates a green thread on Linux's native Ruby thread for each worker process. Each green thread is executed using context-switching so that blocking operations on one Passenger worker process do not prevent that other worker process from being executed.
Am I on the right track?
Thanks for your help!
assembly - 用户空间中的抢先式多任务处理
我正在尝试在程序集中实现绿色线程/进程。
例如,我得到了这个带有两个循环的 x64 汇编代码(nasm 语法)。它输出很多'a',但我希望它输出'a's和'b's。这当然不是一个真实的例子,因为只需将两个循环结合起来就可以解决问题。
因此,我想编写某种调度程序,将指令指针更改为main.t1
或main.t2
每隔几微秒,同时保存一些寄存器并更改堆栈指针。
我知道如果这在用户空间是不可能的,那么进程似乎不太可能改变正在运行的程序,因为这会引入一些安全漏洞。如果不能从用户空间完成,是否可以使用内核模块?
python - python线程和绿色线程中的锁定行为有什么区别?
通常的python线程和greenthread(eventlet)中的行为threading.Lock()
之间有什么区别吗?threading.Semaphore()
linux - forkIO/killThread 与 forkProcess 的交互
我已经编写了下面的代码,并注意到killThread
块和线程仍在继续。只有当我在 forkProcess 中执行此操作时才会发生这种情况,如果我删除了 forkProcess,一切都会按预期工作。
代码
输出
这不是没有内存分配的常见问题,因此 GHC 的线程调度程序不运行。我通过运行程序验证了这+RTS -sstderr
一点,这表明垃圾收集器运行得非常频繁。我在 linux 64bit 上运行它。
python - Python tasklet 不是打破了“没有 GOTO”的规则吗?
我对 Stackless Python 的 tasklet 进行了大量的谷歌研究。每个来源都提到它作为一个线程
但是tasklet不是并发的。他们逐部分执行代码。
像这样的代码:
将打印
tasklet 执行代码,直到遇到 stackless.schedule() 然后它从开始或从上次暂停的地方执行下一个 tasklet。
每个程序员都知道“无 GOTO”的黄金法则。我的问题是:
这和 GOTO 有什么不同?
如果不并行执行,使用 tasklet 有什么好处?
如果它们不是真正的线程,为什么每个消息来源都提到它们作为线程替代品?
python - 如果您有一个阻塞功能,请使用 greenthreads
Python 中的绿色线程具有协作式多任务处理来完成工作。它们是否应该用于以下场景,因为它们不会为此产生/将控制权传递给其他线程。
设想:
阻塞功能只有一个命令:一个长时间运行的 SSH 到另一台机器。因此,即使您有多个绿色线程,也有可能多个 SSH 连接甚至都没有打开,因为第一个线程不会控制下一个线程来启动连接。
将通过机器上的 SSH 进行安装
python - 猴子补丁环境中的 eventlet.greenthread.sleep VS time.sleep
我们在 eventlet green-threads + monkey-patching 上运行服务器。我需要通过定期检查来实现等待循环,并且我想把 sleep 放在里面。
之间有什么区别:
在猴子修补的环境中?我想知道猴子补丁是否可以处理 time.sleep