Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在.NET中通信顺序进程_.net_Go - Fatal编程技术网

在.NET中通信顺序进程

在.NET中通信顺序进程,.net,go,.net,Go,我最近一直在与Go合作,我突然想到,也许相同的CSP模型可以构建到未来版本的.NET中。我所说的不仅仅是一个新的库,它提供了通道类型和类似的编程体验/模型,使用现有的线程原语;我的意思是在整个VM和编译器中实现该模型,以生成与Go类似的可执行代码(我相信Go生成的代码在事件循环中执行) 这是否可行?以前有人谈论过吗?…或者我“喝了太多的苦艾酒”。在这一点上,我完全无法理解如何实现这一点。从一个比.NET或Microsoft生态系统更熟悉的人的角度来写这篇文章,但试图使用更嵌入这个世界的资源 Wi

我最近一直在与Go合作,我突然想到,也许相同的CSP模型可以构建到未来版本的.NET中。我所说的不仅仅是一个新的库,它提供了通道类型和类似的编程体验/模型,使用现有的线程原语;我的意思是在整个VM和编译器中实现该模型,以生成与Go类似的可执行代码(我相信Go生成的代码在事件循环中执行)


这是否可行?以前有人谈论过吗?…或者我“喝了太多的苦艾酒”。在这一点上,我完全无法理解如何实现这一点。

从一个比.NET或Microsoft生态系统更熟悉的人的角度来写这篇文章,但试图使用更嵌入这个世界的资源

Windows生态系统确实包括一些形式的用户模式任务切换,类似于Go的scheduler所做的:,并且作为一个稍微友好一些的开发人员选项,可以用于从您自己的代码中调度操作系统线程。就我所能找到的(,)而言,两者都没有暴露在.NET中

拉里·奥斯特曼(Larry Osterman)在关于上面链接的纤维的帖子中解释了到2005年纤维不再被大量使用的一些原因。一些原因是Windows API中光纤的特殊特性,但其他原因更普遍地适用于用户模式调度。现在执行上下文切换需要几微秒;这不是一个问题,除非你期望每秒进行数十万次切换。由于缓存未命中,切换到不同数据上的不同代码可能已经导致微秒的延迟,即使完全在用户模式下进行。从用户线程中获得的好处很好,但是没有理由认为它们是成功还是失败

NET中确实有异步编程工具,它们不创建OS管理的线程,尽管这与用户管理的线程不同。让I/O操作在后台运行,同时执行其他操作更加方便,这类似于goroutines在异步网络中的某些用法(,)。但这并不意味着这是个好主意

我非常喜欢围棋,但正如我建议人们在围棋中编写惯用的围棋一样,我会说在.NET中编写惯用的C#等等。在这两种情况下,可能都会好的


如果您发现自己遇到了一个您认为可能涉及线程的问题,您可以随时查看您是否真的做了足够多的切换来解决这个问题,如果是这样的话,请返回到您的代码中,找出如何使事情恢复控制。晚一点担心通常比过早担心要好,因为你没有工作代码,这都是理论上的

也许@EriclipperGo不使用事件循环,而是一个自定义调度程序,就像您的操作系统用于本机线程的调度程序一样(goroutines通常被称为“轻量级”或“绿色”线程),但它是在Go运行时内实现的,并编译成任何Go二进制文件。我不是.NET方面的专家,但是
async
/
wait
似乎是。我怀疑.NET是否会全力以赴地使用类似go-like的用户模式线程(比如);变化太大了。但是我不会担心的。如果您知道的是.NET,请编写简单的.NET代码,分析/获取结果的生产指标,并在可能有用的地方选择性地异步ify。很好地解释了为什么用户模式调度不如引入win32光纤时重要。切换线程的代码本身已经变得便宜得多,部分原因是更快的CPU,而其他成本并没有降低多少(比如处理不同数据/代码的另一个线程的缓存丢失)。正如我建议Gopher编写惯用Go一样,我建议编写常规线程.NET,除非/直到相关开销成为问题。为Java生产JCSP的坎特伯雷团队有一个CCSP运行时(带有C API),这是可用的最快的上下文切换调度程序之一。把它和.Net结合起来会很有趣。它使用了几十年前的Transputer技术,这是一个惊人的“非发明于此”水平。Go使用CSP并不意味着它不是C#提供的有用替代品。CSP不仅仅是它的低级实现。@KenoguLabz我想我的回答与我的意思不同!所问的问题显然不是关于CSP模型(“我不是在谈论一个……类似的编程……使用现有线程原语的模型”),而是改变“VM和编译器”以更好地工作。因此,我的回答集中在实现细节和它们之间的权衡上,我得出结论,C#的以线程为中心的操作系统模型通常运行良好。如果你认为这对人们有帮助,你可以写一个竞争性的答案!这是公平的,你是对的,我认为这是对手头问题的更好的解读。我唯一的诡辩就是它是地道的Go。。。但即使在那里,我想我明白了你的意思,在大多数情况下,这并不是你在.NET中使用的第一个工具。感谢您的澄清。:)