我刚观看了以下视频:Node.js简介,但仍然不明白你如何获得速度优势.
主要是,有一点Ryan Dahl(Node.js的创建者)说Node.js是基于事件循环而不是基于线程的.线程很昂贵,应该只留给并发编程的专家来使用.
之后,他展示了Node.js的体系结构堆栈,它具有底层的C实现,内部有自己的Thread池.显然,Node.js开发人员永远不会启动自己的线程或直接使用线程池...他们使用异步回调.我明白了.
我不明白的是,Node.js仍然在使用线程...它只是隐藏了实现,所以如果有50个人请求50个文件(当前不在内存中),那么如何更好,那么不需要50个线程?
唯一的区别是,由于它在内部管理,Node.js开发人员不必编写线程细节的代码,但在其下面仍然使用线程来处理IO(阻塞)文件请求.
那么你是不是真的只是遇到一个问题(线程)并在问题仍然存在时将其隐藏起来:主要是多线程,上下文切换,死锁......等等?
必须有一些我仍然不明白的细节.
假设我有以下代码:
package main
import "fmt"
type Car struct{
year int
make string
}
func (c *Car)String() string{
return fmt.Sprintf("{make:%s, year:%d}", c.make, c.year)
}
func main() {
myCar := Car{year:1996, make:"Toyota"}
fmt.Println(myCar)
}
Run Code Online (Sandbox Code Playgroud)
当我调用fmt.Println(myCar)并且有问题的对象是指针时,我的String()方法被正确调用.但是,如果对象是一个值,我的输出将使用Go内置的默认格式进行格式化,并且我的代码不会调用格式化所述对象.
有趣的是,无论是哪种情况,如果我手动调用myCar.String(),无论我的对象是指针还是值,它都能正常工作.
如果对象与Println一起使用时,无论对象是基于值还是基于指针,如何以我想要的方式格式化对象?
我不想对String使用值方法,因为这意味着每次调用该对象时都会复制哪个接缝不合理.而且我不想总是手动调用.String(),因为我正试图让鸭子打字系统完成它的工作.
提前致谢!
-Ralph
我没有找到一个很好的参考来声明我自己的功能
jquery.ready(function(){});
Run Code Online (Sandbox Code Playgroud)
我想声明它们,因此它们在就绪闭包的同一范围内.我不想让全局的js命名空间变得混乱,所以我不希望它们在ready闭包之外声明,因为它们只针对里面的代码.
那么如何声明这样的函数......我并不是指一个自定义的jquery扩展方法/函数......只是一个常规的'ol函数,它做了一些微不足道的事情,比如:
function multiple( a, b ){
return a * b;
}
Run Code Online (Sandbox Code Playgroud)
我想遵循jquery建议和函数声明语法.我可以通过声明一个类似上面的乘法函数来使它工作......但是由于某些原因它看起来不正确所以我想我只需要一些指导.
为什么std::io::copy需要将reader和writer参数作为可变引用传递?
我可以理解为什么编写器需要进行变异才能容纳写入数据的数据,从而改变其内部状态.
但是,为什么读者也必须被标记为可变参考?如果我只是在读数据,那么我不是只需要对给定类型的引用而不是可变引用吗?
这里记录了Rust的移动语义的一个很好的例子:在Rust By Example网站上的Rust Move Semantics.
我对两个案例都有基本的了解.第一个是原语如何具有新别名,原始仍然可以使用,因为最终结果是看到i32利用Copy特征的副本.这对我来说很有意义.
此外,由于许多好的理由,第二个示例在具有多个引用i32堆上的别名方面是有意义的.Rust强制执行所有权规则,因此现在无法使用原始别名创建新绑定.这有助于防止数据争用,双重释放等.
但似乎还有第三个案例没有被谈到.Rust如何实现不实现Copy特征的堆栈分配结构的移动? 使用以下代码对此进行说明:
#[derive(Debug)]
struct Employee{
age: i32,
}
fn do_something(m: Employee){
println!("{:?}", m);
}
fn main() {
let x = Employee {
age: 25,
};
do_something(x);
//compiler error below because x has moved
do_something(x);
}
Run Code Online (Sandbox Code Playgroud)
我知道:在上面的例子中,Rust会Employee在堆栈上分配.上述结构不实现Copy特征,因此在分配给新别名时不会被复制.这对我来说非常混乱,因为如果Employee结构被分配在堆栈上并且也没有实现Copy特性在哪里/如何移动?它是否在物理上移动到do_something()堆栈框架?
在解释这个难题时,我们对任何帮助表示赞赏.
是否准确地说明一个向量(以及其他集合类型)是一个Iterator?
例如,我可以通过以下方式循环遍历向量,因为它实现了Iterator特征(据我所知):
let v = vec![1, 2, 3, 4, 5];
for x in &v {
println!("{}", x);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我想使用属于Iterator特征的函数(例如fold,map或filter),为什么我必须首先调用iter()该向量?
我的另一个想法是,可能会将矢量转换为a Iterator,在这种情况下,上面的语法更有意义.
给出以下代码:
package main
import (
"encoding/json"
"fmt"
"log"
)
type Employee struct {
Id int "json:id"
}
func main() {
b, err := json.Marshal(&Employee{Id: 2})
if err != nil {
log.Fatal("Couldn't marshal the Employee")
}
fmt.Println(string(b))
}
Run Code Online (Sandbox Code Playgroud)
_由于Employee结构定义良好,因此可以使用占位符可靠地忽略检查错误.理论上它应该永远不会失败,所以问题是忽略这种类型的错误并在这种类型的样板错误检查上节省一点是一个好习惯吗?
忽略看起来像这样:
package main
import (
"encoding/json"
"fmt"
)
type Employee struct {
Id int "json:id"
}
func main() {
b, _ := json.Marshal(&Employee{Id: 2})
fmt.Println(string(b))
}
Run Code Online (Sandbox Code Playgroud) 有些人知道RockScroll Visual Studio插件非常棒.它将您的滚动条变为代码的迷你预览,并提供Eclipse功能,突出显示您在代码中双击的任何单词.
问题是RockScroll的作者选择了一种非常难以看到的颜色,几乎无法实现这种酷炫且非常有用的功能.
所以我的问题是.是否可以自定义颜色或以某种方式指定自己的颜色?
请继续关注,因为我回答了自己的问题并找到了方法!
我从未真正对这个问题做过准备:但是在重写方法中有条件地调用base.SomeMethod()会是一种可怕的犯罪吗?
示例如下:
protected override void SomeMethod()
{
if( condition > 0 )
base.SuperMethod();
}
Run Code Online (Sandbox Code Playgroud)
我知道这可能被认为是不好的做法但我到目前为止从未阅读过这样的说法.
我把头发拉过这一头.我正在尝试使用zeromq和gevent的最简单的示例.我将此脚本更改为使用PUB/SUB套接字,当我运行它时,'server'套接字永远循环.如果我取消注释gevent.sleep(0.1)行,那么它按预期工作并产生另一个绿色线程,在这种情况下是客户端.
问题是,为什么我必须手动添加睡眠呼叫?我想当我导入zmq.green版本的zmq时,发送和接收调用是非阻塞的,并且在下面执行任务切换.
换句话说,为什么我必须添加gevent.sleep()调用以使此示例工作?在Jeff Lindsey的原始示例中,他正在执行REQ/REP套接字并且他不需要添加睡眠调用...但是当我将其更改为PUB/SUB时,我需要它来为此处理客户端.
#Notes: Code taken from slide: http://www.google.com/url?sa=t&rct=j&q=zeromq%20gevent&source=web&cd=27&ved=0CFsQFjAGOBQ&url=https%3A%2F%2Fraw.github.com%2Fstrangeloop%2F2011-slides%2Fmaster%2FLindsay-DistributedGeventZmq.pdf&ei=JoDNUO6OIePQiwK8noHQBg&usg=AFQjCNFa5g9ZliRVoN_yVH7aizU_fDMtfw&bvm=bv.1355325884,d.cGE
#Jeff Lindsey talk on gevent and zeromq
import gevent
from gevent import spawn
import zmq.green as zmq
context = zmq.Context()
def serve():
print 'server online'
socket = context.socket(zmq.PUB)
socket.bind("ipc:///tmp/jeff")
while True:
print 'send'
socket.send("World")
#gevent.sleep(0.1)
def client():
print 'client online'
socket = context.socket(zmq.SUB)
socket.connect("ipc:///tmp/jeff")
socket.setsockopt(zmq.SUBSCRIBE, '')
while True:
print 'recv'
message = socket.recv()
cl = spawn(client)
server = spawn(serve)
print 'joinall'
gevent.joinall([cl, server])
print 'end'
Run Code Online (Sandbox Code Playgroud) rust ×3
go ×2
javascript ×2
architecture ×1
c# ×1
concurrency ×1
gevent ×1
immutability ×1
inheritance ×1
iterator ×1
jquery ×1
node.js ×1
pyzmq ×1
traits ×1