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

0 投票
2 回答
308 浏览

java - Quasar暂停执行

我有一个Class名称,它Foo调用. 延伸. 里面有一个调用。现在哪个会停?实例或实例? 签名(它已定义,这是我感到困惑的主要原因):non-staticbarMethod()BarBarFiber
barMethod()park()FiberFooBar

park()static

如果答案是Foo(似乎是这样),我该如何停车Barsuspend (park) Bar我主要是不打算Foo
如果你给我一个关于如何停放Bar实例的答案,那么请告诉我,既然我想停放Bar,不Foo应该barMethod()SuspendExecution吗?它不会被 的任何实例访问Bar,并且我不想Foo在此方法中停放任何实例(仅限Bar)。

还请提供关于 的所有相同问题的答案unpark()。它会应用于当前FiberFoo在这种情况下为实例)还是会影响Bar实例?如果是后者,那么我怎样才能解除Bar实例,而不是Foo实例?

0 投票
1 回答
103 浏览

java - 我可以假设类星体中的 SettableFuture 作为光纤吗?

我可以假设 a在异步代码中SettableFuture充当a 吗Fiber(应该假设为 a ForkJoinTask)?

除了线程之外,Quasar SettableFuture 还可以阻塞光纤。

SettableFuture API
Parallel Universe Comsat 文档

0 投票
1 回答
343 浏览

fiber - 当正在运行的光纤处于阻塞状态时,线程是否可以运行另一条光纤

据我所知,当正在运行的纤程阻塞时,一个线程可以运行另一个纤程。但事实并非如此。我创建了100个纤程,它将搜索solr。我发现的结果是所有纤程都按顺序执行。另一个纤维只有在前一个像线程一样完成时才能执行。这是我的代码。

我误解了纤维吗?

0 投票
1 回答
318 浏览

java - Kotlin Capsule Gradle 错误

尝试使用 Gradle 创建胶囊时出现错误。

这是我的 build.script

这是它生成的 jar 文件。 https://dl.dropboxusercontent.com/u/91292881/ShareX/2016/09/libs.zip

请告诉我是什么问题,谢谢!

0 投票
1 回答
128 浏览

java - 调用堆栈是语言安全的数据结构吗?Quasar + Fortran?

我们有一个由我们正在积极开发的 fortran 二进制文件支持的 java 应用程序。我主要在 java 方面,我认为我的工作是保护在 fortran 上工作的人免受一些可能会打扰他们的讨厌的系统事情的影响,比如并发性,而不是强迫他们公开复杂的 API。

我按照这些思路做出的一个决定是将 Java 中的 JNA 样式回调传递到我们的 fortran 二进制文件中。当这个回调被执行时,我们的调用栈看起来像这样:

我的问题是线程之一:如何处理对同一个内存中 fortran DLL 的两个线程访问?我的问题植根于如何在内存中处理调用堆栈的确切细节:为了让 fortran 编译器生成可以从 JNA 调用的代码,而无需一个程序计数器破坏另一个,该编译器必须具有某种与 JVM 就调用堆栈的存储位置达成共识。X86 是否为我们提供了某种单独的程序计数器容器Pthreadsjava.lang.Thread, 和其他线程库都利用这些容器,允许安全隔离调用堆栈?


为了让事情变得真正有趣,我也在讨论使用Quasar —— 对于那些不熟悉的人,Quasar 提供了所谓的“纤维”,它们是“轻量级线程”,由堆栈协同程序实现,这意味着 Quasar 执行堆栈的直接操作-帧。

问题是,虽然我在概念上很乐意将 公开OurCode.computationComponents为回调,但一些业务需求决定了我不能。与其要求我们杰出的 fortran 程序员将他们现有的代码转换为具有显式入口和出口(返回)点的东西,我更愿意使用协程来利用我们现有的代码。

这个想法是协同例程将产生OurCode.computationComponents.java任何作为返回值传递给computationComponents. 然后调用者将完成计算组件回调通常所做的工作,将结果从 with 传入,这将返回并最终返回到HeavyComputation.f99doHeavyComputationresumeHeavyComputationcomputationComponentsHeavyComputation.f99

我当然可以使用阻塞队列和多线程来完成所有这些工作,但试图限制自己使用一个线程意味着我对 Quasar 有一些了解,这有几个原因。

Quasar 能否处理并安全地恢复与我们正在使用的堆栈一样复杂的堆栈?

0 投票
1 回答
356 浏览

c# - Quasar 开源中的 C# Builder 类

我正在尝试了解Github 上的类星体源代码(RAT)

它是使用命令的服务器/客户端之间的高级通信。

我不太了解的有趣部分是Class Builder它使用 Mono.cecil 参考来修改它们为空的程序集变量的值,例如主机、端口等...

0 投票
4 回答
1508 浏览

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。如果最大数量的光纤正在运行,请等到一个完成后再启动一个新的。

0 投票
1 回答
4679 浏览

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 线程死亡(类似于打开文件限制错误)?
0 投票
0 回答
2745 浏览

kotlin - Kotlin 编译器错误内联函数,不完全确定发生了什么

我在 Kotlin 编译器中遇到了这个令人困惑的错误,我不介意更改我的代码,但我想弄清楚我是否真的做错了什么。我认为它遇到问题的代码是这样的:

不知道还能说什么,我可以让它不是内联的,但我认为这段代码应该可以工作。我正在使用带有 Gradle 的 Kotlin 1.0.4。另一方面,我并不积极内联,这实际上是在提供性能改进,我仍然对 crossinline 有点不清楚。但无论哪种方式似乎都应该有效,除了这个内部错误之外,我没有收到任何 IDE 或编译器错误。

0 投票
1 回答
43 浏览

java - Quasar ReenterantReadWriteLock 无法获取

我有一把

我在一个里面执行这个块Fiber

那是因为在文档中它说:

public void lock()
如果读锁和写锁都没有被另一个链持有,则获取写锁并立即返回,将写锁持有计数设置为 1。
如果当前链已经持有写锁,那么持有计数加一并且方法立即返回。
如果锁被另一个 strand 持有,则当前 strand 出于 strand 调度目的而被禁用并处于休眠状态,直到获得写锁为止,此时写锁持有计数设置为 1。

所以我得到这个输出:

这意味着读锁和写锁都不被任何人持有Strand。那为什么我的Fiber被屏蔽了?

编辑。我很确定每一个获得这个锁的纤程都会释放它,所以其他纤程不可能无限地获得它。