问题标签 [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.

0 投票
1 回答
80 浏览

multithreading - 绿色线程和它绑定的内核级线程之间共享哪些数据?

我了解用户级线程或绿色线程由某些用户级线程库管理,并且必须“链接”到某些操作系统线程才能执行其任务。我知道线程只是一系列独立代码的抽象。线程用存储在内存中的一些数据结构来表示。在用户级或绿色线程的情况下,用户空间中存在并由用户级线程库管理。在操作系统级别或内核级别线程的情况下,它们由内核或操作系统存储和管理。我不明白将绿色线程链接到操作系统线程实际上是什么意思?我知道 1:1、n:1、n:m 方案,这不是我的问题所在。我的问题是在绿色线程和它绑定到的内核线程之间复制或共享(或其他)哪些数据结构?当绿色线程必须进行上下文切换时,用户级线程库对这些结构做了什么?

0 投票
0 回答
454 浏览

multithreading - 如何在 Common Lisp 中同时运行多个阻塞循环。[将 cl-async 与线程池中的队列相结合]

我是编程新手,也是 Common Lisp 的新手。我正在尝试解决以下问题:

有流源(S1、S2、S3)、两个处理器(P1、P2)(处理器我不是指 CPU 处理器,而是处理功能/子系统)和四个流目的地(D1、D2、D3、 D4)。通过流,我的意思是数据连续出现,但可能是间歇性的。所以读/写操作可能会阻塞。来自流的数据需要聚合,然后根据它们是什么,由其中一个处理器处理。每个处理器(从其输入聚合)产生四种子聚合,然后将它们发送到上述四个目的地之一。

我有这个问题的伪代码是这样的:

三个循环,S1、S2、S3 各一个,用于数据聚合和调度。对于特定的源(比如 S2)伪代码是:

两个循环,一个用于 P1、P2,用于处理和解聚合。对于特定的处理器(比如 P1)伪代码是:

在处理器和目的地之间,我想使用另一个通道/队列,但没有提到让我的问题对自己来说更简单。

据我了解,大约有十个阻塞点。三,如果数据源中不可用(S1、S2、S3);当处理器(P1,P2)的数据不足时,三个,当目标(D1,D2,D3,D4)没有准备好写入时,四个。

所以我的问题是:如何同时运行所有这些循环(同时是这个词?)而不会相互阻塞;以及程序中正在做的其他事情。

先前的工作:我已经查看了这个SO 问题,来自cl-async 的轮询器通知器。查看Cliki-Concurrency,我还看到了threading-queue。更不用说cl-flowgreen-threads 了。CL-flow 提到它是“Common Lisp 中异步非阻塞并发的库”。有没有办法,我可以使用带有 cl-async 或 cl-flow 的队列库?例如,flow-concurrently似乎是正确的。但是它可以与 cl-async 的绿色线程一起使用来运行非终止循环吗?

我的难点:我试图阅读我上面提到的每个链接并尽可能多地理解。但是,老实说,我什至无法弄清楚从哪里/如何开始。谢谢你的帮助。

编辑:2020 年 2 月 28 日。

我尝试像这样使用 cl-flow。初始化流系统后

我使用了以下功能:

hello-world 是一个简单的函数,我加入了函数 gap 来在文本前插入一些空格。正如所言,我期待三列交错的打印行(同时,异步等),但我只得到一个(第一个循环-hello)列。

我目前的理解如下,请指正:循环和睡眠都是同步语句,所以执行被阻塞。所以我搜索了循环和睡眠的异步版本。我想知道我是否可以使用 cl-async 来做到这一点。

与此同时,我试图简化我的问题。昨天,我也偶然发现了这个问题及其答案。我试图理解它。

此外,由于我使用伪代码发布了我的原始问题,我想知道我希望(比如说)一个库为我提供功能(即使它现在不存在)。

我尝试在 google 中搜索异步代码,大多数结果显示 javascript 库。到目前为止,我只能模糊地掌握两个。Python,Clojure(Java)。写一个从 q1 异步读取的小函数,处理读取 v1 到 v2 的值,然后写入 q2(q1 和 q2 是队列)。对我来说,似乎我可以这样写(说):

当然,必须有合适的 q1 和 q2 实现。在 Clojure(Java) 中,适当地使用 core.async 库:

我上面发布的代码可能是错误的。我是根据我(很可能)肤浅的理解写的。我没有 Python、Clojure(Java) 经验。这些例子也不是煽动任何火焰战争。我认为所有语言都可以很好、强大、方便,并迎合不同的人类程序员。我想解决 CL 中的问题。我是一个资深的人(按年龄),但一个初级的,实际上是一个新手(在编程方面)。我真的很喜欢用 CL 写它。并不是说我已经或即将成为一个伟大的程序员。但是有了CL,我觉得,天啊,我连程序都可以写了!

不管怎样,所以回到问题上来。所以我想要一个库来提供如下语法/功能:

你可能已经猜到了,cc-forever 的意思是(ConCurrently-run FOREVER)。

所以我正在寻找制作这样一个函数/库的帮助。如果我的思维过程仍然很复杂,请提出更好/更简单的替代方案。谢谢。

稍后将再次发布我的尝试。

编辑:2020 年 5 月 27 日

我将继续探索 cl-async 和 cl-flow。我最近遇到了在 cl-async 之上实现的 with-green-thread 宏。作为一个新手,我面临着双重问题:这些库使用不同的语法,并且可能使用它在语义上做不同的事情。目前,我对 with-green-thread 和 cl-flow: 反复感到鼓舞。尽管有时代码会引发错误(可能是我对某些 quicklisp 问题或其他问题的处理不当)。会继续发帖。如果有任何反馈,将很有帮助。

0 投票
3 回答
412 浏览

java - 无法使用 Project Loom 的虚拟线程

我正在探索 Project Loom 中的虚拟线程。文档用以下简单的代码行直截了当地说:

或者

我已经尝试了它们,对于第一个,我收到一个错误 The method startVirtualThread(() -> {})is undefined for type Thread

而对于第二个 -builder()线程类型的方法未定义

一浏览,发现需要lombok,也安装了lombok。但是它没有出现在 Eclipse About 部分,我可以使用 lombok,但我的问题仍然没有解决。

下面的链接显示文档,我指的是。

在此处输入链接描述

示例代码:

在此处输入图像描述

0 投票
2 回答
830 浏览

go - goroutine 在什么时候可以产生?

我试图更好地理解 goroutines 在 Go 程序中是如何调度的,特别是在什么时候它们可以让步给其他 goroutines。我们知道 goroutine 会在 syscals 上产生会阻塞它,但显然这不是全部。

这个问题引起了一些类似的担忧,并且评价最高的答案说 goroutine 也可以打开函数调用,因为这样做会调用调度程序来检查堆栈是否需要增长,但它明确表示

如果您没有任何函数调用,只是一些数学运算,那么是的,goroutine 将锁定线程,直到它退出或遇到可以让其他人执行的东西。

我写了一个简单的程序来检查和证明:

注意:我知道在数组中放置一个值并在oi不同步的情况下递增并不完全正确,但我希望保持代码简单且没有可能导致切换的东西。毕竟,可能发生的最糟糕的事情是在不推进索引(覆盖)的情况下设置一个值,这没什么大不了的。

这个答案不同,我避免使用作为 goroutine 启动的函数中的任何函数调用(包括内置append()loop(),而且我GOMAXPROCS=1根据文档明确设置:

限制可以同时执行用户级 Go 代码的操作系统线程数。

尽管如此,在输出中我仍然看到消息Main//交错Goroutine 1Goroutine 2这意味着以下之一:

  • goroutine 的执行中断并且 goroutine 在某些时刻放弃了控制;
  • GOMAXPROCS不像文档中所说的那样工作,启动更多的操作系统线程来调度 goroutine。

要么答案不完整,要么自 2016 年以来有些事情发生了变化(我在 Go 1.13.5 和 1.15.2 上进行了测试)。

如果这个问题得到了回答,我很抱歉,但我既没有找到解释为什么这个特定的例子会产生控制,也没有找到 goroutines 一般产生控制的点(阻塞系统调用除外)。

注意:这个问题纯粹是理论上的,我现在不打算解决任何实际任务,但总的来说,我假设知道 goroutine 可以产生和不能产生的点可以让我们避免同步原语的冗余使用。

0 投票
0 回答
117 浏览

multithreading - 异步和调度 - 库如何避免最低级别的阻塞?

一段时间以来,我一直在使用各种并发构造,并没有过多考虑所有魔法是如何发生的,这最近让我越来越不安。

为了纠正这种……感觉,我一直在阅读异步是如何在幕后工作的。当我说异步时,在这种情况下,我指的是用户空间/绿色线程/协作多任务处理,尽管我假设其中一些概念也适用于传统的操作系统管理线程,因为涉及到调度程序和工作线程。

我看到一个工作人员如何暂停自己并让其他工作人员执行,但在非阻塞库代码的最低级别,调度程序如何知道先前暂停工作人员的工作何时完成并唤醒该工作人员?

  • 例如,如果您在某种异步块中启动工作人员并执行通常会阻塞的操作(例如 HTTP 请求、SQL 查询、其他 I/O),那么即使您的调用代码是异步的,该操作(库代码) 更好地使用您的异步框架,或者您已经有效地破坏了使用它的目的并阻止您的调度程序在等待您的阻塞调用时调用其他等待操作(您的函数是什么颜色问题),该调用在内部执行你的非阻塞调用代码,来完成。

  • 所以现在我们有异步代码调用其他异步库代码,现在我再次问自己这个问题 -异步库代码如何知道何时暂停和恢复操作?

对我来说,触发 HTTP 请求、继续前进并稍后返回以检查结果的想法很奇怪——不是从概念上而是从实现的角度来看。

您如何执行部分操作,例如发送 TCP 数据包,然后继续执行程序的其余部分,稍后再返回并检查结果是否已交付。送到什么地方?一个插座?

现在我们又深入了一层,您正在使用套接字选择来避免创建线程和阻塞,但是,再次......

  • 这些套接字如何开始操作,在完成之前继续前进,然后 select 如何知道数据何时可用?
  • 您是否不断检查一些缓冲区以查看字节是否已在无限循环中传递,如果没有则继续?

无论如何 - 我想你知道我要去哪里......

我主要关注 HTTP 作为一个激励性的例子,但是同样的问题也适用于任何正常的阻塞操作——它到底是如何工作的?

以下是我在研究该主题时发现的一些有用的资源,这些资源为这个问题提供了参考:

  • David Beazley 的精彩视频Build Your Own Async将引导您完成一个调度程序的简单实现,该调度程序通过在等待队列中休眠来触发回调并暂停执行。我发现这个视频非常有启发性,但它有点短,因为它向您展示了使用异步睡眠如何释放调度程序来执行其他工作人员,但并没有真正了解当您在那些工作人员中调用代码时会发生什么本身必须是非阻塞的,因此它与调度程序配合得很好。

  • 非阻塞 IO 如何在幕后工作- 这让我的理解更加深入,但仍然存在一些不确定性。

0 投票
1 回答
643 浏览

java - Kotlin 协程将如何使用 Project Loom?

目前,Kotlin 协程是在没有 JVM 帮助的情况下实现的。它不使用绿色(虚拟)线程之类的东西。您可以在此处阅读有关协程实现的信息 - https://github.com/Kotlin/KEEP/blob/master/proposals/coroutines.md#implementation-details

在不久的将来(比如 1-2 年),Loom 项目(在 JVM 中实现绿色线程)将会发布。您可以在此处阅读有关它的详细信息 - http://cr.openjdk.java.net/~rpressler/loom/loom/sol1_part1.html

那么,Kotlin 会使用这些虚拟线程作为编译后端吗?或者有一些原因,为什么不可能?我谈论了需要版本的 JVM 目标(很明显,我们需要自己的 android 实现)。

实际上,还有一个更普遍的问题。当 Project Loom 发布时,我们真的需要 Kotlin 协程吗?

0 投票
3 回答
1005 浏览

java - 当用户级线程阻塞时,关于阻塞“对等线程”的困惑

我正在阅读有关线程和进程之间的差异的信息,并且几乎在网上到处都是,通常写有一个差异而没有太多解释:

如果一个进程被阻塞,剩余的进程可以继续执行。如果一个用户级线程被阻塞,它的所有对等线程也会被阻塞。

这对我来说没有任何意义。如果调度程序无法在阻塞线程和就绪/可运行线程之间切换,那么并发的意义是什么?给出的原因是,由于操作系统不区分给定父进程的各种线程,它会立即阻止所有线程。

我觉得这很不令人信服,因为所有现代操作系统都有带有线程 ID 的线程控制块,即使它仅在父进程的内存空间内有效。就像 Galvin 的操作系统书中给出的示例一样,如果拼写检查线程无法连接到某些在线词典,我不希望处理我的输入的线程被阻塞。

要么我对这个概念的理解有误,要么所有这些网站多年来都只是复制了一些旧线程差异。此外,我无法在诸如 Galvin 的书籍或 William Stalling 的 COA 书中讨论过线程的书中找到此声明。

这些是我找到陈述的资源:

0 投票
0 回答
6 浏览

multithreading - python2的绿色线程选项

目前我们无法升级到 py3,但我们需要实现虚拟线程以启用并行 DB 调用。我有什么选择?是否有库或者我要编写自己的实现?