V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  arloor  ›  全部回复第 9 页 / 共 12 页
回复总数  232
1  2  3  4  5  6  7  8  9  10 ... 12  
2020-06-08 11:38:00 +08:00
回复了 Aruforce 创建的主题 程序员 NIO 如下代码怎么绕过死锁?还是说我写的不对?如下代码
@Aruforce 这代码我运行了下,用 nc localhost 8090 测试了下,没有问题啊

你说的空转是什么意思?

不要总是感觉有问题,永远没有最优解,都是权衡和妥协。最怕你觉得这样有问题,然后就什么都不做。

优化是后面的事。

另外,说真的,就是这样了,不要觉得有啥问题。真可以增加的就是线程池了
2020-06-05 14:39:44 +08:00
回复了 Aruforce 创建的主题 程序员 NIO 如下代码怎么绕过死锁?还是说我写的不对?如下代码
@Aruforce 看错了,没看到你用了两个 selector 。

你现在问题是线程 1 register 、线程 2 select,死锁了。解决很简单,用个生产者消费者模型,把要 register 的 channel 放到队列中,线程二在每次 select 前先 register 队列中的 channel 。这时候你可能又要问了,万一线程 2 一直阻塞在 select 时,怎么办? 答案:用 selectNow()或 select ( timeout )。


刚刚看了 netty 源码中怎么进行 register 的,他也是生产者消费者模型,由进行 select 的线程来 register 。代码如下:

AbstractChannel.java (Netty 4.1):

@Override
public final void register(EventLoop eventLoop, final ChannelPromise promise) {
ObjectUtil.checkNotNull(eventLoop, "eventLoop");
if (isRegistered()) {
promise.setFailure(new IllegalStateException("registered to an event loop already"));
return;
}
if (!isCompatible(eventLoop)) {
promise.setFailure(
new IllegalStateException("incompatible event loop type: " + eventLoop.getClass().getName()));
return;
}

AbstractChannel.this.eventLoop = eventLoop;

if (eventLoop.inEventLoop()) {
register0(promise); // 这里不会走到
} else {
try {
// eventLoop 就是 netty 中线程,提交一个 register 任务,后面会被执行
eventLoop.execute(new Runnable() {
@Override
public void run() {
register0(promise);
}
});
} catch (Throwable t) {
logger.warn(
"Force-closing a channel whose registration task was not accepted by an event loop: {}",
AbstractChannel.this, t);
closeForcibly();
closeFuture.setClosed();
safeSetFailure(promise, t);
}
}
}
2020-06-04 21:56:56 +08:00
回复了 Aruforce 创建的主题 程序员 NIO 如下代码怎么绕过死锁?还是说我写的不对?如下代码
问题确实是 select 和 register 都要获取同样的锁。

你现在是启动两个线程,一个 select-accept-register,另一个 select-read/write 。除了锁的问题哈,还有你会丢失 accept 和读写事件,线程 1 会忽略读写,线程 2 会忽略 accept 。

楼主知道 reactor 模式吗?一个线程负责接收事件( accept 、read 、write ),后面一个线程池负责处理这些事件。

应该长这样:一个线程 select-accept/read/write->由线程池来处理不同事件( accept 可以直接在原线程进行 register )

PS:实践到这里差不多了,可以看 netty 了。先用用 netty,然后看下 netty 源码,相信就能清楚。
2020-06-04 10:54:38 +08:00
回复了 fangcan 创建的主题 奇思妙想 有没有拼单的网站?
我想做,并且搭了一个论坛,可以没人发帖

https://bbs.arloor.com
@fxxkgw 大佬跳槽的话想做什么啊
2020-06-03 15:52:34 +08:00
回复了 rqxiao 创建的主题 Elasticsearch elasticsearch 中复杂查询的问题
看下官方文档中 date 和 date_range 这两个数据类型,相信就能解决
2020-06-01 22:54:42 +08:00
回复了 gzh 创建的主题 求职 大家帮忙看看 Java 简历,为什么总是石沉大海.😥
应届生这也差了点才对。。
@xishifendou 开个玩笑,已有下家
比较缺人就是缺两人
大量 hc 就是三个人
我懂了,怪不是我这么难找工作
haobin 牛逼
2020-05-15 11:30:49 +08:00
回复了 forestyuan 创建的主题 云计算 为什么国内有些云厂商支持 CentOS 7 却不支持 CentOS 8?
注意:是从 centos7 安装 centos8 而不是从 centos7 升级 centos8
意思是,新的系统是干净的官方的 centos8 系统,没有你老的数据,也没有云厂商的监控应用。

不需要赞成不赞成,只是说可以做到
然后需要自取,这样
2020-05-15 10:58:16 +08:00
回复了 forestyuan 创建的主题 云计算 为什么国内有些云厂商支持 CentOS 7 却不支持 CentOS 8?
从 centos7 网络安装 centos8,利用 redhat 的 kickstart 技术实现。
要求:
1. 内存至少为 2g
2. 原系统为 centos7
3. 不是阿里云的主机(阿里云需要改镜像为其他,比如华为云的,自己修改即可)
2020-05-15 10:56:33 +08:00
回复了 forestyuan 创建的主题 云计算 为什么国内有些云厂商支持 CentOS 7 却不支持 CentOS 8?
2020-05-13 23:23:41 +08:00
回复了 jizhihaoSAMA 创建的主题 程序员 本科毕业生能直接全栈吗?
既然全栈,那么肯定要懂后端,spring 你说了,sql 必然也要用,redis 也很广泛了。
假如哪天需要用 nosql 、mongodb 、es 、hadoop 、hase 、kafka 、zookeeper 、etcd 、rpc 框架、网络编程
这些应该不是一年两年能全部接触的吧(更不要说熟练)
所以全栈没有那么简单,因为后端都不是一时半会能搞完的。
后端不只是 spring,如果你的项目一直离不开 spring,只能说明你一直在写业务代码。
2020-04-05 23:40:03 +08:00
回复了 noble4cc 创建的主题 Java 调用别人写好的 api 有什么最佳实践吗?
降级( default 实现)
和 try catch Exception
2020-04-04 20:32:54 +08:00
回复了 WhereverYouGo 创建的主题 Linux 求教 squid 怎么用!
2020-03-30 19:18:35 +08:00
回复了 janda 创建的主题 Linux centos7 防火墙失效,这是怎么回事?
docker 使用 iptables 创建了 nat 规则,prerouting 链规则。
防火墙设置的是 input 规则

流量进来会先看 prerouting 规则,再看 input 规则。prerouting 命中了,防护哦强的 input 自然没用了
2020-03-21 18:39:08 +08:00
回复了 king1688888888 创建的主题 Linux 请问升级 OpenSSL 的问题。
OpenSSL 除了用来生成证书弄 https 外,还有用途
2020-03-21 15:32:12 +08:00
回复了 amiwrong123 创建的主题 Java NIO 中 检测到 channel 连接断开后的处理方法?
异常也是可读事件的一种,如果出现异常了,那么可以关闭 channel 并且取消对该 channel 可读事件的监听
1  2  3  4  5  6  7  8  9  10 ... 12  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1558 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 34ms · UTC 16:38 · PVG 00:38 · LAX 09:38 · JFK 12:38
Developed with CodeLauncher
♥ Do have faith in what you're doing.