在我在BSD套接字编程的上下文中运行的每个示例和讨论中,似乎将文件描述符设置为非阻塞I/O模式的推荐方法是使用O_NONBLOCK标志fcntl(),例如
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
Run Code Online (Sandbox Code Playgroud)
我已经在UNIX中进行了十多年的网络编程,并且一直使用FIONBIO ioctl()调用来执行此操作:
int opt = 1;
ioctl(fd, FIONBIO, &opt);
Run Code Online (Sandbox Code Playgroud)
从来没有真正考虑过为什么.刚学会这种方式.
有没有人对其中一个或两个可能各自的优点有任何评论?我认为可移植性轨迹在某种程度上有所不同,但不知道在多大程度上与ioctl_list(2)单个ioctl方法的那个方面没有对话.
我在Perl上编写了一个在Linux上运行的持久网络服务.
不幸的是,随着它的运行,它的Resident Stack Size(RSS)只是在缓慢但肯定地增长,增长和增长.
尽管我努力消除所有不需要的哈希键并删除对象的所有引用,否则会导致引用计数保留在原位并阻碍垃圾收集.
是否有任何好的工具可以在Perl程序中分析与各种本机数据原语,祝福散列引用对象等相关的内存使用情况?你用什么来追踪内存泄漏?
我不习惯在Perl调试器或任何各种交互式分析器中花费时间,因此我们将感激温暖,温和,非深奥的反应.:-)
我很好奇是否
CREATE INDEX idx ON tbl (columns);
Run Code Online (Sandbox Code Playgroud)
与
CREATE UNIQUE INDEX idx ON tbl (columns);
Run Code Online (Sandbox Code Playgroud)
在扫描索引列时,PostgreSQL或MySQL实现具有显着的算法性能优势,或者UNIQUE关键字是否只是在索引旁边引入了唯一约束.
我想可以公平地说,只要索引很可能在内部实现为某种类似哈希1的结构,并且定义中的冲突处理会产生O(1)性能以外的其他内容,这可能是公平的.鉴于这一前提,如果大部分值相同而结构退化为线性,则很可能.
因此,出于我的问题的目的,假设值的分布是相对离散和均匀的.
提前致谢!
1对于我来说这是一个纯粹的推测问题,因为我不熟悉RDBM内部.
我知道Perl的OO模型相当原始; 在大多数方面,它本质上是命名空间黑客攻击.
不过,我想知道是否有可能创建类似"界面"的东西?我的目标是建立一个扩展其他基类的基类,其主要目的是强制要求这些子类实现某些方法(名称很好,不需要签名).我真的不在乎它是一个"纯虚拟"类(如Java中的"接口")还是具有超类中这些方法的实际实现存根的具体类,但我想要的是确定它是确定性必要的子类实现超类的某些方法.
这可能吗?如果是这样,怎么样?
我正在使用SVN + SSH从SVN服务器检出存储库的工作副本,其中所有开发人员都是developer组的成员,并且对存储库目录和关联的元数据具有完全读/写权限:
svn co svn+ssh://someuser@svn.server/path/to/repository
Run Code Online (Sandbox Code Playgroud)
一些开发人员处理在共享shell帐户(root)下签出的同一工作副本.由于此存储库用于生产环境中的配置修订控制,因此这是不可避免的.给每个开发人员一个单独的shell帐户在目标机器上(正在进行结帐的那个)将是解决这个问题的一种方法,因为他们每个人都可以拥有自己的工作副本,但不幸的是,这在这里是不可接受的.
我们有各种提交后挂钩,可以发送详细提交的电子邮件,包括提交更改的人的用户名.
问题是,一旦使用svn+ssh://URI方案使用给定的用户名检出工作副本,提交和更新似乎也必须在该用户名下完成.由于两个原因,这是不可行的:
1)最初进行结账的人可能不是现在提交的人,我们需要提交后的电子邮件和其他提交后的挂钩才能确切知道提交者是谁,以及
2)显然,提交要求提交用户知道进行原始结账的人的帐户的密码,使用RSA密钥进行非交互式认证,尽管有理由#1.
有没有办法动态切换在这种情况下用于身份验证的远程帐户的用户名?
我做了一些研究,之前发现了这个问题:
不幸的是,接受的答案(svn switch)中的建议不起作用:
[root@db repo-directory]# svn switch svn+ssh://user2@10.250.10.1/u/svc/repositories/repo-name
user2@10.250.10.1's password:
svn: 'svn+ssh://user1@10.250.10.1/u/svc/repositories/repo-name' is not the same
repository as 'svn+ssh://user2@10.250.10.1/u/svc/repositories/repo-name'
Run Code Online (Sandbox Code Playgroud)
任何想法将不胜感激.提前谢谢您的考虑!
Vue 3 文档和民间文献中的指导是ref()针对标量和基元的,而reactive()针对对象的。
然而,在 JavaScript 中,数组是 Object 的一种特殊情况。尽管存在监视嵌套对象元素是否添加新属性和其他问题等问题,但无论从性能角度还是其他角度来看,是否存在是否将数组处理为 或 的最佳ref实践reactive?
我正在尝试开发一个服务,其中包含许多客户端和服务器套接字(服务器服务以及连接到托管组件并保持不变的客户端),这些服务器是同步轮询的IO::Select.我们的想法是处理I/O和/或请求通过工作线程池产生的处理需求.
shared使数据在Perl(threads::shared)中的线程之间可共享的关键字有其限制 - 句柄引用不属于可共享的基元.
在我发现无法共享句柄和/或句柄引用之前,计划是有一个select()负责轮询的线程,然后将相关句柄放在ThreadQueue线程池中的某些内容中,以实际读取和写入.(当然,我正在设计这个,以便对所使用的实际描述符集的修改select将是线程安全的,并且仅在一个线程中发生 - 运行相同的一个,select()因此从来没有在它运行时,显然.)
这似乎不会发生,因为句柄本身无法共享,因此轮询以及读取和写入都需要从一个线程发生.这有什么解决方法吗?我指的是跨线程的实际系统调用的分解; 很明显,有一些方法可以使用队列和缓冲区来在其他线程中生成数据并在其他线程中实际发送.
这种情况产生的一个问题是我必须给出select()超时,并且期望它足够高,不会导致轮询相当大的描述符集的任何问题,同时足够低,不会在我的时序中引入太多延迟事件循环 - 虽然,我确实理解,如果在轮询过程中检测到实际的I/O集成员资格,select()将提前返回,这部分缓解了问题.我宁愿有一些select()从另一个线程中醒来的方法,但由于句柄无法共享,我不能轻易想到这样做的方法,也不能看到这样做的价值; 什么是其他线程知道何时适合唤醒select()?
如果没有解决方法,Perl中这类服务的优秀设计模式是什么?我需要相当大的可伸缩性和并发I/O,因此出于非阻塞路由而不是仅为每个侦听套接字和/或客户端和/或服务器进程生成线程,因为许多人使用更高的 - 现在,当处理套接字时,这些级别的语言是不习惯的 - 它似乎是Java领域的一种标准做法,似乎没有人关心java.nio.*面向系统的编程的狭隘领域.也许这只是我的印象.无论如何,我不想这样做.
因此,从经验丰富的Perl系统程序员的角度来看,这些东西应该如何组织?单片I/O线程+纯工作线程(非I/O)线程+大量队列?某种聪明的黑客?除了我已经列举的内容之外,任何线程安全都需要注意?有没有更好的办法?我在使用C语言构建此类程序方面拥有丰富的经验,但没有使用Perl习语或运行时特性.
编辑:PS我肯定发现,也许一个具有这些性能要求的程序和这个设计应该只是不用Perl编写.但我看到Perl中生成了大量非常复杂的服务,所以我不确定.
在Java中,是否可以覆盖子类中的成员数据,并将该重写版本作为超类实现中使用的数据?
换句话说,这就是我想要发生的事情,并且它没有发生:
abstract public class BasicStuff {
protected String[] stuff = { "Pizza", "Shoes" };
public void readStuff() {
for(String p : stuff) {
system.out.println(p);
}
}
}
Run Code Online (Sandbox Code Playgroud)
..
public class HardStuff extends BasicStuff {
protected String[] stuff = { "Harmonica", "Saxophone", "Particle Accelerator" };
}
Run Code Online (Sandbox Code Playgroud)
这个调用:
HardStuff sf = new HardStuff();
sf.readStuff();
Run Code Online (Sandbox Code Playgroud)
...打印Pizza和Shoes.我想让它打印后者.
我认识到这是一个相当差的等级OO实践; 我需要它用于非常具体的情况,因为我正在使用XML配置和反射.
有没有可以实现这一目标的修饰符?
是的,我确实认识到有一些包装可以用来解决我的子类中的这个问题,例如通过指示现在的内容stuff[]存储在具有不同名称的数组中.我只是想保持这个简单,原则上我很好奇.
非常感谢提前!
所以,我有一种情况需要将三个值传递给一个串行的BlockingQueue队列:
(SelectableChannel, ComponentSocketBasis, Integer).
Run Code Online (Sandbox Code Playgroud)
它们实际上根本不需要进行哈希映射,并且使用HashMap是荒谬的,因为每个条目总是只有一个键; 如果他们只是在某种有序的集合中,那就好了.但是,由于缺少已知的替代方法,我在我的实现中使用了HashMap并生成了这个混淆的泛型组合:
private LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>> deferredPollQueue = new LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>>();
Run Code Online (Sandbox Code Playgroud)
这看起来真的很荒谬.我必须是一个可怕的n00b.当然有一种更好的方法可以做到这一点,不需要我在检索值时分解密钥或浪费(理论上 - 实际上,Java总是臃肿:)算法复杂性对无用的哈希计算我不需要因为我的密钥空间为1,甚至不想关联映射三个引用,而只是将它们分组?有了这个实现,我必须这样取出值:
while(deferredPollQueue.size() > 0) {
System.out.println("*** Draining new socket channel from queue");
HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer> p = deferredPollQueue.take();
SelectableChannel chan = null;
ComponentSocketBasis sock = null;
int ops = 0;
HashMap<SelectableChannel, ComponentSocketBasis> q = p.keySet().iterator().next();
chan = q.keySet().iterator().next();
sock = q.get(chan);
ops = p.get(q).intValue();
SelectionKey k = chan.register(selector, ops);
if(!channelSupervisorMap.containsKey(k))
channelSupervisorMap.put(k, sock);
}
Run Code Online (Sandbox Code Playgroud)
我很确定每一个有能力的人都认为这是一种荒谬的方式,所以问题是 - 什么是正确的方法?:)我无法在任何地方找到java.util.Pair或java.util.Triplet的证据.
我认为Orthodox Way(TM)只是为了容纳这个三元组而做一个自定义类或接口,但是对于这么大的系统中的这么小的任务来说,这似乎是荒谬的冗长和不必要的 - 尽管如此,那是Java本身.
出于同样的原因,也许这些值可以放在ArrayList或Vector或它们的衍生物上,但是在Java中,这并没有比我从这个HashMap中获得更简洁的解决方法,尽管它确实解决了也许是算法复杂性问题.
回到Perl …
我正在使用jQuery将文本追加到textarea中
var box = $('<textarea></textarea>')
.attr({id: 'log_viewer',
readonly: '',
cols: 100,
rows: 40})
.appendTo($(outputEntity));
Run Code Online (Sandbox Code Playgroud)
从WebSocket接收数据时,它会附加到textarea的内容中:
ws.onmessage = function(msg) {
var data = decodeURIComponent(msg.data);
data = data.replace('<', '<');
data = data.replace('>', '>');
box.append(data);
}
Run Code Online (Sandbox Code Playgroud)
我需要的是这个盒子自动滚动到底部,这样视口总是以输出的最后一页为中心.在关于此主题的其他一些Stack Overflow建议之后,我尝试了:
$('#log_viewer').scrollTop = $('#log_viewer')[0].scrollHeight - $('#log_viewer').height();
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用 - 至少,不是Linux上的Chrome或Firefox,这是我可以访问的.该框不会滚动.
如何让这个框自动滚动到JS最底层的页面?使用append()添加输出以某种方式干扰底层维度检测机制?追加()甚至是去那里的正确方法吗?
或许我应该根本不使用textarea,而是使用带滚动条的DIV?不可否认,我相当落后于HTML + CSS并且不知道如何最好地实现这一点,并且仍然得到我所追求的等宽度格式化的包装输出.
非常感谢任何建议!
perl ×3
java ×2
javascript ×2
sockets ×2
abstract ×1
c ×1
class-design ×1
collections ×1
dataset ×1
debugging ×1
hash ×1
html ×1
indexing ×1
inheritance ×1
interface ×1
jquery ×1
map ×1
memory-leaks ×1
mysql ×1
nonblocking ×1
object ×1
oop ×1
postgresql ×1
profiler ×1
queue ×1
repository ×1
ssh ×1
subclass ×1
svn ×1
unix ×1
vue.js ×1
vuejs3 ×1