-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
在带IO(Netty)的场景下,基于本项目有没有什么好的办法能做到跨线程传递对象? #232
Comments
这个 是 就像
集成 涉及了 对于执行/调度组件(如 欢迎你一起来挖一下 |
我怀疑在这样的场景中通过修饰底层线程的集成是不太能做到的,考虑到这样的场景: Runnable runnable = () -> {/* capture then run then restore */};
// 在线程A中给操作注册一个回调
new Thread(() -> client.sendAsync().thenRun(runnable)).start();
// Netty或者其他的类似reactor模型的selector线程收到了响应之后触发回调
eventLoopGroup.execute(() -> runnable.run()); 因为触发回调的线程和设置回调的线程是两个线程,因此无法通过修饰底层线程来做到捕获线程本地变量(触发回调的线程无法访问其他线程的线程本地变量),因此只能在设置回调的时候进行包装(这就不仅限于Runnable了,理论上这里的回调有可能是任意对象的任意方法)。 我现在想到的办法是尽可能在每一个设置回调的地方调用 但我其实并不太确定 |
👍 @guyeu 具体的解决方法的展开要好好想想; PS 相关的 issue:
我想的和你一样,『这种类涉及的场景太多了,肯定会有场景不需要这样的修饰』,即 Overkill 了。 |
static {
Function<Runnable, Runnable> decorator = task -> {
return TtlRunnable.get(task);
};
Schedulers.onScheduleHook("my-hook", decorator);
} 这种方式能解决 @oldratlee @guyeu |
COOL ! ! @malone081021 👍 👏 @guyeu 可以尝试测试验证一下,是不是能帮助解决你的问题 :") |
@oldratlee 这个已经验证过了,可以缓解部分问题,但由于hook执行和注册回调不一定在同一个线程里,所以没有办法真正解决问题。 |
其实问题比较简单,就是 像这样的异步调用是否有
除了用
TtlRunnable/TtlWrappers
修饰回调以外的方法,在回调和外部传递类似MDC
的参数?以上图片来自这段Mermaid代码
The text was updated successfully, but these errors were encountered: