问题标签 [quasar]
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.
java - Quasar暂停执行
我有一个Class
名称,它Foo
调用. 延伸.
里面有一个调用。现在哪个会停?实例或实例?
签名(它已定义,这是我感到困惑的主要原因):non-static
barMethod()
Bar
Bar
Fiber
barMethod()
park()
Fiber
Foo
Bar
park()
static
如果答案是Foo
(似乎是这样),我该如何停车Bar
?suspend (park)
Bar
我主要是不打算Foo
。
如果你给我一个关于如何停放Bar
实例的答案,那么请告诉我,既然我想停放Bar
,不Foo
应该barMethod()
扔SuspendExecution
吗?它不会被 的任何实例访问Bar
,并且我不想Foo
在此方法中停放任何实例(仅限Bar
)。
还请提供关于 的所有相同问题的答案unpark()
。它会应用于当前Fiber
(Foo
在这种情况下为实例)还是会影响Bar
实例?如果是后者,那么我怎样才能解除Bar
实例,而不是Foo
实例?
java - 我可以假设类星体中的 SettableFuture 作为光纤吗?
我可以假设 a在异步代码中SettableFuture
充当a 吗Fiber
(应该假设为 a ForkJoinTask
)?
除了线程之外,Quasar SettableFuture 还可以阻塞光纤。
fiber - 当正在运行的光纤处于阻塞状态时,线程是否可以运行另一条光纤
据我所知,当正在运行的纤程阻塞时,一个线程可以运行另一个纤程。但事实并非如此。我创建了100个纤程,它将搜索solr。我发现的结果是所有纤程都按顺序执行。另一个纤维只有在前一个像线程一样完成时才能执行。这是我的代码。
我误解了纤维吗?
java - Kotlin Capsule Gradle 错误
尝试使用 Gradle 创建胶囊时出现错误。
这是我的 build.script
这是它生成的 jar 文件。 https://dl.dropboxusercontent.com/u/91292881/ShareX/2016/09/libs.zip
请告诉我是什么问题,谢谢!
java - 调用堆栈是语言安全的数据结构吗?Quasar + Fortran?
我们有一个由我们正在积极开发的 fortran 二进制文件支持的 java 应用程序。我主要在 java 方面,我认为我的工作是保护在 fortran 上工作的人免受一些可能会打扰他们的讨厌的系统事情的影响,比如并发性,而不是强迫他们公开复杂的 API。
我按照这些思路做出的一个决定是将 Java 中的 JNA 样式回调传递到我们的 fortran 二进制文件中。当这个回调被执行时,我们的调用栈看起来像这样:
我的问题是线程之一:如何处理对同一个内存中 fortran DLL 的两个线程访问?我的问题植根于如何在内存中处理调用堆栈的确切细节:为了让 fortran 编译器生成可以从 JNA 调用的代码,而无需一个程序计数器破坏另一个,该编译器必须具有某种与 JVM 就调用堆栈的存储位置达成共识。X86 是否为我们提供了某种单独的程序计数器容器Pthreads
,java.lang.Thread
, 和其他线程库都利用这些容器,允许安全隔离调用堆栈?
为了让事情变得真正有趣,我也在讨论使用Quasar —— 对于那些不熟悉的人,Quasar 提供了所谓的“纤维”,它们是“轻量级线程”,由堆栈协同程序实现,这意味着 Quasar 执行堆栈的直接操作-帧。
问题是,虽然我在概念上很乐意将 公开OurCode.computationComponents
为回调,但一些业务需求决定了我不能。与其要求我们杰出的 fortran 程序员将他们现有的代码转换为具有显式入口和出口(返回)点的东西,我更愿意使用协程来利用我们现有的代码。
这个想法是协同例程将产生OurCode.computationComponents.java
任何作为返回值传递给computationComponents
. 然后调用者将完成计算组件回调通常所做的工作,将结果从 with 传入,这将返回并最终返回到HeavyComputation.f99
doHeavyComputation
resumeHeavyComputation
computationComponents
HeavyComputation.f99
我当然可以使用阻塞队列和多线程来完成所有这些工作,但试图限制自己使用一个线程意味着我对 Quasar 有一些了解,这有几个原因。
Quasar 能否处理并安全地恢复与我们正在使用的堆栈一样复杂的堆栈?
c# - Quasar 开源中的 C# Builder 类
我正在尝试了解Github 上的类星体源代码(RAT)
它是使用命令的服务器/客户端之间的高级通信。
我不太了解的有趣部分是Class Builder
它使用 Mono.cecil 参考来修改它们为空的程序集变量的值,例如主机、端口等...
java - Quasar Fiber 相当于 Java 的 ThreadPoolExecutor?
我一直对 Quasar 及其轻量级 Fibers 作为 Threads 的替代品感到好奇。在查阅了他们的API 文档后,我无法弄清楚如何将典型的ThreadPoolExecutor转换为 Fibers 池。
上面的代码创建了一个有 10 个线程的池,池前面的一个队列可以容纳 10 个元素和一个拒绝策略(当队列满时)让主线程自己执行一个 Runnable 任务。由于for循环创建了100个runnable,它们将在池中一次执行10个,10个排队,主线程自己拿起一个Runnable,直到其他线程完成,之后主线程返回将Runnables添加到executor。
您将如何使用 Quasar 的 Fibers 来做到这一点?它是不是一开始就应该这样使用?
编辑:我最初的问题措辞不佳。本质上,我试图找到一种机制来限制可以同时运行的 Fiber 数量。例如,如果已经有 200 个 Fiber 在运行,则不要启动更多 Fiber。如果最大数量的光纤正在运行,请等到一个完成后再启动一个新的。
java - 高度并发的 Apache Async HTTP 客户端 IOReactor 问题
应用说明:
- 我正在使用由 Comsat 的 Quasar FiberHttpClient(版本 0.7.0)包装的 Apache HTTP 异步客户端(版本 4.1.1)来运行和执行一个高度并发的 Java 应用程序,该应用程序使用光纤在内部将 http 请求发送到多个 HTTP 端点
- 应用程序在 tomcat 之上运行(但是,fiber 仅用于内部请求调度。tomcat servlet 请求仍以标准阻塞方式处理)
- 每个外部请求在内部打开 15-20 个 Fiber,每个 Fiber 构建一个 HTTP 请求并使用 FiberHttpClient 进行调度
- 我正在使用 c44xlarge 服务器(16 核)来测试我的应用程序
- 我要连接到抢占保持活动连接的端点,这意味着如果我尝试通过重用套接字来维护,则在请求执行尝试期间连接会关闭。因此,我禁用连接回收。
根据上述部分,这是我的光纤 http 客户端的调整(当然我使用的是单个实例):
/li>打开文件的 ulimits 设置为超高(软和硬值均为 131072)
- Eden 设置为 18GB,总堆大小为 24GB
- OS Tcp 堆栈也经过了很好的调整:
kernel.printk = 8 4 1 7 kernel.printk_ratelimit_burst = 10 kernel.printk_ratelimit = 5 net.ipv4.ip_local_port_range = 8192 65535 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.rmem_default = 16777216 net.core .wmem_default = 16777216 net.core.optmem_max = 40960 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.core.netdev_max_backlog = 100000 net.ipv4.tcp_max_syn_backlog = 100000 net.ipv4.tcp_max_tw_buckets = 2000000 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_slow_start_after_idle = 0 net.ipv4.tcp_sack = 0 net.ipv4.tcp_timestamps = 1
问题描述
- 在中低负载下一切都很好,连接被租用,关闭并且池补充
- 在某些并发点之外,IOReactor 线程(其中 16 个)似乎在死亡之前停止正常运行。
- 我写了一个小线程来获取池统计信息并每秒打印一次。在大约 25K 的租用连接处,不再通过套接字连接发送实际数据,该
Pending
统计数据也向猛增的 30K 未决连接请求发送 - 这种情况持续存在并且基本上使应用程序无用。在某些时候,I/O Reactor 线程会死掉,不确定何时,到目前为止我还无法捕捉到异常
lsof
在调用 java 进程时,我可以看到它有数以万计的文件描述符,几乎所有文件描述符都在 CLOSE_WAIT 中(这是有道理的,因为 I/O 反应器线程死亡/停止运行并且永远不会真正关闭它们- 在应用程序中断期间,服务器没有严重过载/cpu 压力过大
问题
- 我猜我正在某个地方到达某种边界,尽管我对它可能驻留的内容或位置一无所知。下列情况除外
- 我是否有可能到达操作系统端口(毕竟所有应用请求都源自单个内部 IP)限制并创建一个错误,导致 IO Reactor 线程死亡(类似于打开文件限制错误)?
kotlin - Kotlin 编译器错误内联函数,不完全确定发生了什么
我在 Kotlin 编译器中遇到了这个令人困惑的错误,我不介意更改我的代码,但我想弄清楚我是否真的做错了什么。我认为它遇到问题的代码是这样的:
不知道还能说什么,我可以让它不是内联的,但我认为这段代码应该可以工作。我正在使用带有 Gradle 的 Kotlin 1.0.4。另一方面,我并不积极内联,这实际上是在提供性能改进,我仍然对 crossinline 有点不清楚。但无论哪种方式似乎都应该有效,除了这个内部错误之外,我没有收到任何 IDE 或编译器错误。
java - Quasar ReenterantReadWriteLock 无法获取
我有一把锁:
我在一个里面执行这个块Fiber
:
那是因为在文档中它说:
public void lock()
如果读锁和写锁都没有被另一个链持有,则获取写锁并立即返回,将写锁持有计数设置为 1。
如果当前链已经持有写锁,那么持有计数加一并且方法立即返回。
如果锁被另一个 strand 持有,则当前 strand 出于 strand 调度目的而被禁用并处于休眠状态,直到获得写锁为止,此时写锁持有计数设置为 1。
所以我得到这个输出:
这意味着读锁和写锁都不被任何人持有Strand
。那为什么我的Fiber
被屏蔽了?
编辑。我很确定每一个获得这个锁的纤程都会释放它,所以其他纤程不可能无限地获得它。