由买买提看人间百态

topics

全部话题 - 话题: goroutine
首页 上页 1 2 3 (共3页)
d******e
发帖数: 2265
1
来自主题: Programming版 - yield和goroutine啥区别?
should be a simple iterator like this.
def from_x_stream(x):
count = x
while (true):
count += 1
yield count
d****n
发帖数: 1637
2
来自主题: Programming版 - 如何快速处理大量网上xml文件?
http://play.golang.org/p/vS409gRveG
开20个worker,多用几个 电脑,当你 存xml时候注意一下duplicates就搞定了。指定
比你的 python快
// In this example we'll look at how to implement
// a _worker pool_ using goroutines and channels.
package main
import "fmt"
import "net/http"
import "log"
import "io/ioutil"
// Here's the worker, of which we'll run several
// concurrent instances. These workers will receive
// work on the `jobs` channel and send the corresponding
// results on `results`. We'll sleep a second per job to
// simulate... 阅读全帖
d****n
发帖数: 1637
3
来自主题: Programming版 - 如何快速处理大量网上xml文件?
fyi: worker is goroutine
z****e
发帖数: 54598
4
来自主题: Programming版 - 如何快速处理大量网上xml文件?

用点脑子,go底层就是thread
goroutine也不是什么新鲜玩意
如果你懂obj c的话,这种东西早就在ios编程上出现过了
这种写法远比worker简单直接
你真要上worker的话,有本事跟vert.x比比啊
json被秒得连渣都不剩,xml自己试试啊
就怕你不敢试
k****i
发帖数: 101
5
来自主题: Programming版 - 如何快速处理大量网上xml文件?
- non-blocking(async) i/o 底层先要支持,如epoll等
- 应用层有多种实现,node用single threaded eventloop,go用goroutine,c#有
async/await,java有threadpool如某些async client libs,也有eventloop如vertx,
这些都能解决io-bound request/connection:thread=1:1的问题。
z****e
发帖数: 54598
6
就是vertx-sync
就是利用fiber构建一个轻量级的thread
which并不一一对应kernal thread
简单说,如果你block了fiber
并不会导致os的thread被blocked
通过这种方式,你就可以丢掉promise, rxjava以及更为糟糕的callback了
直接用你最熟悉的sync的方式编写异步代码
唯一的改变就是你把Future改成Message
然后随便用.get, .body,会block fiber但是没有关系,不会阻塞thread
类似goroutine,vert.x依赖的这个类似go的项目名字叫做quasar
http://docs.paralleluniverse.co/quasar/
然后vert.x就把quasar的api用它自己的api包装起来
就类似vert.x把akka的actor给抄了过来,然后用相对简单的api包装起来一样
3.1发布之前,对于这个需求的呼声相当高,这是链接
http://github.com/vert-x3/vertx-sync/blob/master/src/main/ascii
效率对比,quas... 阅读全帖
d****n
发帖数: 1637
w***g
发帖数: 5958
8
那个golib有点意思。不知道操统的阻塞操作怎么处理。
就go而言,runtime应该能知道哪些操作会阻塞,然后可以自动切换goroutine。
但是如果用C/C++,直接调用操统接口,比如select,
golib怎么知道?
p*****g
发帖数: 7
9
The legacy of GO: http://dave.cheney.net/2015/11/15/the-legacy-of-go
1)gofmt,
2) interfaces,
3)goroutines
T********i
发帖数: 2416
10
和App Store
介绍:
中文版
http://qwhomeautomation.com/doc.appintro.cn.html
英文版
http://qwhomeautomation.com/doc.appintro.html
简单说明一下:
1. 我这个是完全独立的异步I/O,基本上Node.js的Lua版,也可称Node.Lua
2. 异步太恶心,直接折腾成同步,就是一个Goroutine的Lua版
3. Nest就是我系统的一个App。写一个比Nest更聪明的App也不难。更有趣的是Nest
100多个专利,现在看来都难保。
4. 更深层次的意义我先不说,各位琢磨去吧
5. 我花大本钱专利保护。现在系统可以下载免费使用。只支持Insteon设备啊。愿意其
我们QA的用户多得是。
d****n
发帖数: 1637
11
nodejs file IO 就只能嘿嘿了,写起来别扭,读起来不爽。
golang 一点也不怕。完全没压力。8个goroutine出去,一个channel等回来,你有多少
cpu,我就能扩展多少。
nodejs 就会,
setImmediate(function(){
})
要不就async.parallel([])
有人提promise,说高级,我看半斤八两。debug时候就挠头皮吧。
w***g
发帖数: 5958
12
来自主题: Programming版 - 我是一个线程 (转载)
coroutine和monitor是两个基本上被实践抛弃了的概念。python的
yield其实是标准的coroutine,但是一般讲python的资料都会把它
叫做iterator或者generator。现在还在提coroutine的,一般都是
哗众取宠混淆视听。
如何区别coroutine和thread的一个标准就是:coroutine的yield
返回后,执行权落在那一行程序是确定的,由程序的
逻辑决定。thread yield/preempt了以后,执行权落在那一行程序是
不确定的,由thread scheduler决定的。即使是cooperative thread
跑在一个CPU上,执行权落哪儿也是不确定的。
goroutine就是一种light-weighted thread,不是coroutine。
wikipedia上那篇coroutine也是概念非常混淆乱讲一通。其实只要
程序写对了,抠概念屁用没有。我书读太多脑子有点坏掉了。
T********i
发帖数: 2416
13
来自主题: Programming版 - 我是一个线程 (转载)
coroutine和iterator根本就是两个概念。coroutine有自己的stack,yield以后也要有
context switch,iterator不一定。
基于coroutine可以有multi-task和scheduler。因此coroutine yield以后,可以直接
回到scheduler,执行权落在那一行程序是由scheduler决定,不一定是确定的。
因此coroutine和thread很像。但是就是yield的含义不一样。我不确定std::thread实
现coroutine是不是一个好主意?因为为了能够做到兼容,因为thread多任务不需要
yield也能保证响应,但是coroutine必须yield,因此为了保证兼容性长任务要插入
yield才能保证响应,但是会带来额外的负担。
goroutine这种就是coroutine,context switch只需要切换stack和register,不需要
flush cache,switch TLB,security check,这些都是微秒级别的操作。而且内置
scheduler
,还要在I/O函数外面包上w... 阅读全帖
g****t
发帖数: 31659
14
来自主题: Programming版 - Go的并发和channel看上去非常厉害啊
的goroutine和channel看上去非常厉害啊
https://talks.golang.org/2010/io/talk.pdf
不过自从多年前Lucent破产,贝尔实验室解散之后,
我已经彻底觉悟了。凡是讲:think in xxx的90%都是老骗子。
这种东西搞的复杂是为了让几千万用户用着都不出问题。
但是如果是个人用户,其实是不是自己c写个yield和内存快照,几个锁定更方便呢?
新模型学太多,可能大脑会出问题啊
Rob pike的话:
concurrency不是关于performance的东西,是程序的新组织方式
我看改成goto也可以
goto不是关于performance的东西,是程序的新组织方式
w***g
发帖数: 5958
15
来自主题: Programming版 - Go的并发和channel看上去非常厉害啊
channel是p9的东西。go其实就是goroutine, 我以前专门写过的,帖子我主页上有存档。
http://www.wdong.org/goshi-zen-yao-lai-de.html
k****i
发帖数: 101
16
来自主题: Programming版 - Go的并发和channel看上去非常厉害啊
看到没
牛不是巧合
基础。。。

:channel是p9的东西。go其实就是goroutine, 我以前专门写过的,帖子我主页上有存
档。
a*****e
发帖数: 1700
17
GHC 的 M:N 轻线程调度比 goroutine 早很多年
w***g
发帖数: 5958
18
是bug吧。如果是go的bug, 修好了可是大credit。不过我觉得是楼主参数没设好,资源
用光了。

:理论上用 goroutine 来替代 thread,
:用 channel 协助调度是比较干净的一个模型。
S*A
发帖数: 7142
19
这个我们的确有这个需求,至少要 demo 能够处理这样的流量。
如果是我一个人写和维护就直接 C + epoll 橹了,而且保证是最优化的。
这个 go 的头不是我开的,但是也不是完全没有解就是了。
其实说白了就是放弃 goroutine N:1 tcp 的对应关系。
然后把 go 当 C 写,自己处理 server pool,epoll 这些。
网上有人讨论这个基本上是这个结果。
java 就算了吧。我这个不是典型的 web 后段应用,
有其他考虑,java 基本上不考虑了。

B
s********k
发帖数: 6180
20
Go哪里算鼓励blocking编程啊,完全相反吧,channel你不能理解成block,理解成更好
manage的lock更合适,你这么一说感觉是不是你的channel buffer没有开够啊,比如你
的req和rsp各自goroutine,但是中间用一个channel share info,如果channel
buffer不够,总是会出现producer、consumer这样问题吧
S*A
发帖数: 7142
21

Go 和 python 性能还是强太多,不是一个级别的东西。
我就是想说这个,goroutine 直接简单粗暴上了数量
效果是不好的。
还没有到 DPDK 这样变态。而且 DPDK 移植性比较弱。
调硬件平台。
s********k
发帖数: 6180
22
看了下你的逻辑,你现在这样实现?
go func(recv socket)?
如果成这样是不是更好?
func recv(socket){
for pub in range publishers{
go func(service)
}
}
就是说把goroutine用在业务逻辑,不是IO上?

epoll
IO
go
S*A
发帖数: 7142
23

不知道你想如何改这个。现在问题是有 N 个 tcp 连接。
每一个发送都会有可能 block。如果你里面那个 for
loop 也是 N 个元素的话,并没有节省 goroutine。
如果里面那个 for loop service, << N 的话,那就是
发送的时候是等一个 tcp 发完了才发下一个,失去了
并发性。发送的数据包比一个Ethernet 包大多了。
一个 tcp 发玩一组才发下一个的带宽用不满。
s********k
发帖数: 6180
24
可能没写清楚,就是不用go做TCP recv这一套交给epoll,你不是接受回来数据之后要
发送到message queue/pub service?把这一部分做成goroutine?
s********k
发帖数: 6180
25
golfing poll, 看看这个?https://github.com/mailru/easygo/blob/master/netpoll
/epoll.go
goroutine根据业务需要来开就可以,确实没有必要开太多,如果一个pod上开太多本来
资源就不够啊(假设你用k8s的话)

发帖数: 1
26
目前发现两大问题:
1. GOGC,关闭Garbage Collection,性能提高20%,无语了,golang不是吹牛GC比JVM
G1强很多么?NGINX不用GC不是照样可以写程序么?
2. 滥用FUTEX,从strace上看,一个HTTP GET引发众多threads拼抢,thundering herd
problem,跟NGINX的SO_REUSEPORT设计完全不同。GO runtime调度需要用futex,众多
goroutines给本来就很脆弱的futex加重负担。
各位大侠,我没学过golang,只花了几天测测http性能,就发现这两个问题,这应该是
设计失误吧?
[pid 29063] <... epoll_wait resumed> [{EPOLLIN|EPOLLOUT, {u32=4228357504,
u64=140170486062464}}], 128, -1) = 1
[pid 29063] futex(0x147c010, FUTEX_WAKE, 1) = 1
[pid 29063] read(6,
[pid 290... 阅读全帖

发帖数: 1
27
golang到目前为止也不支持SO_REUSEPORT,这个至少比NGINX慢5倍。
垃圾GC估计比NGINX慢1倍。多余的goroutine调度再慢上1倍。
algernon建立在golang上,golang在性能设计上有问题,algernon也没办法。
s********k
发帖数: 6180
28
所以说就是golang的这个包并没有做event based loop,还是直接狂开goroutine,所
以肯定比不过专门针对epoll做的IO密集型nginx?

发帖数: 1
29
剛才看了看goroutine的評論,發現Csharp的fiber和Java的loom都很有競爭力,Cpp也
有Facebook的Folly庫支持fiber,看來狗家go確實沒有軟家Csharp語言能力強。
s********k
发帖数: 6180
30
哦所以你意思是swap到disk上了?不做GC确实有可能,不过如果GC下多个goroutine频
繁调度不知道会不会频繁重新load TLB,golang的schedule好像在避免这个

发帖数: 1
31
在runtime/proc.go裡面有很多lock(&sched.lock),
例如把goroutine放到global runq裡面就需要lock
func goschedImpl(gp *g) {
status := readgstatus(gp)
if status&^_Gscan != _Grunning {
dumpgstatus(gp)
throw("bad g status")
}
casgstatus(gp, _Grunning, _Grunnable)
dropg()
lock(&sched.lock)
globrunqput(gp)
unlock(&sched.lock)
schedule()
}
sched是runtime2.go裡面的一個全局變量
var (
allglen uintptr
allm *m
... 阅读全帖

发帖数: 1
32
目前发现两大问题:
1. GOGC,关闭Garbage Collection,性能提高20%,无语了,golang不是吹牛GC比JVM
G1强很多么?NGINX不用GC不是照样可以写程序么?
2. 滥用FUTEX,从strace上看,一个HTTP GET引发众多threads拼抢,thundering herd
problem,跟NGINX的SO_REUSEPORT设计完全不同。GO runtime调度需要用futex,众多
goroutines给本来就很脆弱的futex加重负担。
各位大侠,我没学过golang,只花了几天测测http性能,就发现这两个问题,这应该是
设计失误吧?
[pid 29063] <... epoll_wait resumed> [{EPOLLIN|EPOLLOUT, {u32=4228357504,
u64=140170486062464}}], 128, -1) = 1
[pid 29063] futex(0x147c010, FUTEX_WAKE, 1) = 1
[pid 29063] read(6,
[pid 290... 阅读全帖

发帖数: 1
33
golang到目前为止也不支持SO_REUSEPORT,这个至少比NGINX慢5倍。
垃圾GC估计比NGINX慢1倍。多余的goroutine调度再慢上1倍。
algernon建立在golang上,golang在性能设计上有问题,algernon也没办法。
s********k
发帖数: 6180
34
所以说就是golang的这个包并没有做event based loop,还是直接狂开goroutine,所
以肯定比不过专门针对epoll做的IO密集型nginx?

发帖数: 1
35
剛才看了看goroutine的評論,發現Csharp的fiber和Java的loom都很有競爭力,Cpp也
有Facebook的Folly庫支持fiber,看來狗家go確實沒有軟家Csharp語言能力強。
s********k
发帖数: 6180
36
哦所以你意思是swap到disk上了?不做GC确实有可能,不过如果GC下多个goroutine频
繁调度不知道会不会频繁重新load TLB,golang的schedule好像在避免这个

发帖数: 1
37
在runtime/proc.go裡面有很多lock(&sched.lock),
例如把goroutine放到global runq裡面就需要lock
func goschedImpl(gp *g) {
status := readgstatus(gp)
if status&^_Gscan != _Grunning {
dumpgstatus(gp)
throw("bad g status")
}
casgstatus(gp, _Grunning, _Grunnable)
dropg()
lock(&sched.lock)
globrunqput(gp)
unlock(&sched.lock)
schedule()
}
sched是runtime2.go裡面的一個全局變量
var (
allglen uintptr
allm *m
... 阅读全帖
m*****n
发帖数: 3575
38
是不是这样理解
goroutine只能做到支持单机多核
例如8核还好用,32核效率就一般,再多了就扯了
分布式计算必须得换map reduce?

cpp
s********k
发帖数: 6180
s********k
发帖数: 6180
40
http://morsmachine.dk/netpoller
再补同样的一篇
in Go, all I/O is blocking. The Go ecosystem is built around the idea that
you write against a blocking interface and then handle concurrency through
goroutines and channels rather than callbacks and futures.
这个里面netpoll应该就是blocking转变成none blocking的方法,不过不知道你用的那
个benchmark lib是不是支持了netpoll
w***g
发帖数: 5958
41
用cpp可破。


:我上一個貼提到了golang兩大問題:GOGC和goroutine調度,今天開會同事又發現很多
g****t
发帖数: 31659
42
你说的这些都是很好的知识。但结论有些不靠谱。尤其是未来java的
Fiber赢goroutine.这个大部分其实是取决于资金,不是技术。
f*******t
发帖数: 7549
43
不知道你为什么一个劲地揪着某些运算的性能不放,眼光狭隘。我就不在另一个帖回复
了,意见统一写在这里。
* 写一个http web service,几十行代码没有额外dependency,编译成一个binary放到
所有环境中都能运行。C++行吗?
* 加第三方库一般go get一下就解决了。C++/java行吗?就我个人经验而谈,从github
下载的C++开源项目,几乎没一个能按照README里的步骤顺利编译的。
* 随便创建几百个goroutine,之间用channel通信,基本不用考虑性能问题,开发效率
极高。C++行吗?你在测试中发现的不容易解决的性能问题,都是极端条件下才会发生
的现象,绝大多数时候并不需要担心这点。
* Go才出现几年,没标准委员会很正常。大公司不敢用的说法完全没有逻辑。大公司有
百万行以上的代码,工具都是针对现有语言开发的,不可能直接替换成另一种语言,都
是先从一小群爱好者开始慢慢推广。这也是为什么Amazon等公司一直用Java,FB费好大
劲给PHP做HHVM。目前Go在中小型公司的新项目上很受欢迎,另外uber算大公司了吧,
很多backend se... 阅读全帖
w***g
发帖数: 5958
44
用cpp可破。


:我上一個貼提到了golang兩大問題:GOGC和goroutine調度,今天開會同事又發現很多
g****t
发帖数: 31659
45
你说的这些都是很好的知识。但结论有些不靠谱。尤其是未来java的
Fiber赢goroutine.这个大部分其实是取决于资金,不是技术。
f*******t
发帖数: 7549
46
不知道你为什么一个劲地揪着某些运算的性能不放,眼光狭隘。我就不在另一个帖回复
了,意见统一写在这里。
* 写一个http web service,几十行代码没有额外dependency,编译成一个binary放到
所有环境中都能运行。C++行吗?
* 加第三方库一般go get一下就解决了。C++/java行吗?就我个人经验而谈,从github
下载的C++开源项目,几乎没一个能按照README里的步骤顺利编译的。
* 随便创建几百个goroutine,之间用channel通信,基本不用考虑性能问题,开发效率
极高。C++行吗?你在测试中发现的不容易解决的性能问题,都是极端条件下才会发生
的现象,绝大多数时候并不需要担心这点。
* Go才出现几年,没标准委员会很正常。大公司不敢用的说法完全没有逻辑。大公司有
百万行以上的代码,工具都是针对现有语言开发的,不可能直接替换成另一种语言,都
是先从一小群爱好者开始慢慢推广。这也是为什么Amazon等公司一直用Java,FB费好大
劲给PHP做HHVM。目前Go在中小型公司的新项目上很受欢迎,另外uber算大公司了吧,
很多backend se... 阅读全帖

发帖数: 1
47
你是不是根本看不懂我最開始提到的goroutine sched問題?目前runtime 2根本不支持
NUMA,在G和M之間引入P完全是勉強提高性能的臨時解決方案,go關鍵字隱含多線程不
可控,性能低下在支持NUMA的新sched前完全無解。新sched概念早在2014年就提出了,
目前根本沒有實現,說明golang內部嚴重缺人,也是無解。go是二流語言沒跑。
DL/ML的核心庫都是cpp,py只不過是調用一下而已。


: 你讲的事实部分和你的结论完全没有关系。

: 比较的什么加拿大澳大利亚更是一比糊涂账。

: 多少年来除了你,没人拿golang和c plus比性能。

: 人的第一卖点是M:N scheduler

: 第二卖点不是语言,是易用性。

: 治地位

g****t
发帖数: 31659
48
来自主题: Programming版 - 问个弱智问题
每个用户分几个goroutine调用下,用golang的scheduler来调服M:N. 应该是最糙快猛的
办法吧?


: build a single server SGE.

: http://star.mit.edu/cluster/docs/0.93.3/guides/sge.html

: everyone should qsub the jobs.

: let server kick out non-qsub jobs with timeout.

首页 上页 1 2 3 (共3页)