这个问题涉及围绕tcp/ip协议的一般概念,对于它已经有了很好的答案,但是我希望能够深入了解node.js http/net库的特性.
节点http服务器实例允许为两种类型的事件注册回调,'request'事件和'connection',event.其中后者继承自网络库,以及字段"_connections",它计算服务器当前具有的并发连接数.
现在,在我看来,由于http是无状态协议,因此请求和连接事件之间应该存在1-1的对应关系 - 但事实并非如此.当我在调试器中单步执行一个简单的"hello-world"服务器时,我看到请求事件的数量超过了连接事件.我也看到了,即使没有对服务器进行调用(并且进程没有暂停),.connections字段也永远不会清零.为什么请求数量不等于连接数,为什么服务器在最终调用response.end()之后保持连接打开(当响应缓冲区应该被刷新并且连接结束?).
另外,http服务器的并发连接数(对keep-alive没有任何作用)怎么会高于1?请求基本上没有在socket上排队并逐个处理?我知道Node是异步的,但我也认为它的行为是单线程的.
提前致谢!
我正在开展一个小项目来分析我觉得有趣的一些网站上的内容; 这是一个真正的DIY项目,我正在做我的娱乐/启蒙,所以我想尽可能多地编写自己的代码.
显然,我将需要数据来提供我的应用程序,我想我会写一个小爬虫,可能需要20k页的html并将它们写入我的硬盘上的文本文件.但是,当我查看SO和其他网站时,我找不到任何有关如何执行此操作的信息.这可行吗?似乎有可用的开源选项(webpshinx?),但我想尽可能自己写这个.
Scheme是我唯一熟悉的语言,但我认为我会利用这个项目来学习一些Java,所以如果有任何racket或java库会对此有所帮助,我会感兴趣.
所以我想总结一下我的问题,有什么好的资源可以开始这个?如何让我的爬虫从其他服务器请求信息?我是否必须为此编写一个简单的解析器,或者这是不必要的,因为我想获取整个html文件并将其保存为txt?
我在理解循环如何在方案中工作时遇到一些困难.特别是这个代码运行但我不知道为什么
(define (bubblesort alist)
;; this is straightforward
(define (swap-pass alist)
(if (eq? (length alist) 1)
alist
(let ((fst (car alist)) (scnd (cadr alist)) (rest (cddr alist)))
(if (> fst scnd)
(cons scnd (swap-pass (cons fst rest)))
(cons fst (swap-pass (cons scnd rest)))))))
; this is mysterious--what does the 'for' in the next line do?
(let for ((times (length alist))
(val alist))
(if (> times 1)
(for (- times 1) (swap-pass val))
(swap-pass val))))
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚(let for ((
应该在这里做什么,而for …
对于我正在研究的项目,我正在实现一个链表数据结构,它基于一对的概念,我定义为:
class Pair:
def __init__(self, name, prefs, score):
self.name = name
self.score = score
self.preferences = prefs
self.next_pair = 0
self.prev_pair = 0
Run Code Online (Sandbox Code Playgroud)
where self.next_pair
和self.prev_pair
是分别指向上一个和下一个链接的指针.
要设置链表,我有一个看起来像这样的安装功能.
def install(i, pair):
flag = 0
try:
old_pair = pair_array[i]
while old_pair.next_pair != 0:
if old_pair == pair:
#if pair in remainders: remainders.remove(pair)
return 0
if old_pair.score < pair.score:
flag = 1
if old_pair.prev_pair == 0: # we are at the beginning
old_pair.prev_pair = pair
pair.next_pair = old_pair
pair_array[i] = pair …
Run Code Online (Sandbox Code Playgroud) 环顾四周后,我找不到这个问题的答案,虽然我怀疑之前已被问过.我能找到的最接近的是这个函数指针在对象中,虽然它没有得到我所追求的.
假设我们有一段这样的代码:
var foo = function () { /* some code */ };
Run Code Online (Sandbox Code Playgroud)
现在,我假设在评估时间内,名称foo在其环境中绑定到函数的内部表示,然后在应用程序时间内查找.
现在假设我们在程序中稍后有一个对象:
var obj = {};
obj.func = foo;
Run Code Online (Sandbox Code Playgroud)
此时,环境中应该有两个相同功能对象的副本,一个绑定到foo,另一个绑定到obj.func.但是,假设我不想要该函数的两个副本,而是让obj.func指向foo - 有没有办法做到这一点?这就是我想出来的:
var obj = {};
obj.func = function () { foo(); };
Run Code Online (Sandbox Code Playgroud)
这会有用吗?有没有更好的办法?
非常感谢
编辑澄清
道歉 - 我认为我不够清楚.我希望这有帮助.
我不确定Javascript评估过程是如何工作的,但是我们说它会跟踪一些内部表示的环境,我们在这里将它抽象地表示为一组键值对.
现在,当评估者看到一些代码如
var foo = function () { /* some code */ };
Run Code Online (Sandbox Code Playgroud)
它在它的环境中构造它:['foo':[function object]].然后,稍后,当它看到这样的事情时:
var bar = foo;
Run Code Online (Sandbox Code Playgroud)
它在环境中查找foo以检索它的值,一个函数对象,然后像这样扩充环境.['foo':[function object],'bar':[function object]].现在,相同的功能确实在环境中有两次.这是javascript设置其环境的方式吗?如果没有,那么它是如何做到的?
我的询问动机如下.假设我们定义了一些函数,然后我们导出的一个对象作为这些函数的接口,我们知道它们将多次实例化.如果对象包含指向函数的指针而不是函数本身,则会更有效.