问题标签 [goroutine]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - 为什么我的 goroutine 相互等待而不是在完成后完成?
我对 Go 很陌生,我的代码中有一件事我不明白。我写了一个简单的冒泡排序算法(我知道它不是很有效;))。现在我想启动 3 个 GoRoutines。每个线程都应该独立于其他线程对他的数组进行排序。完成后,函数。应该打印一个“完成”的消息。
这是我的代码:
这就是我得到的:
线程 2 不应该先完成,因为他的切片是最小的吗?似乎所有线程都在等待其他线程完成,因为“完成”消息同时出现,无论切片有多大..
我的脑虫在哪里?=)
提前致谢。
*编辑:将“time.Sleep(1)”放入bubblesort func的for循环中时。它似乎工作..但我想用这段代码记录不同机器上的持续时间(我知道,我必须改变随机的东西),所以睡眠会伪造结果。
windows - 简单的 goroutine 在 Windows 上不起作用
我正在用 goroutine 做一些测试,只是为了了解它们是如何工作的,但它们似乎根本没有运行。我做了一个非常简单的测试:
我希望这会打印“测试”,但它根本不做任何事情,没有消息但也没有错误。我还尝试for {}
在程序末尾添加 a 以让 goroutine 有时间打印一些东西,但这并没有帮助。
知道可能是什么问题吗?
concurrency - 多个 goroutine 打印到标准输出是否安全?
我的程序中有多个 goroutine,每个 goroutine 都在fmt.Println
没有任何显式同步的情况下调用。这是安全的(即,每一行是否会单独出现而不会损坏数据),还是我需要创建另一个具有同步功能的 goroutine 来专门处理打印?
go - 有更好的方法来跟踪 goroutine 响应吗?
我正试图了解 goroutines。我创建了一个简单的程序,可以跨多个搜索引擎并行执行相同的搜索。目前,为了跟踪回复的数量,我计算了我收到的数量。不过好像有点业余。
有没有更好的方法来知道我何时收到了以下代码中所有 goroutine 的响应?
go - Go中的死锁,两个例程拆分工作
我在 go 中遇到了一个死锁问题。
该程序接受一个整数数组 a,并将其分成两部分。然后它将这两个部分放在两个不同的例程中并总结所有元素。在此之后,它应该在通道 res 中发送两个结果。然后应该将两个 res(现在是 ch)加在一起并打印。
我的问题:我试图通过大量移动关闭函数来解决死锁问题,但似乎没有任何帮助。显然,它只适用于一个例程 Add 运行。
php - 为Windows适配php并行执行功能?
这是一个并行执行命令数组并返回结果数组的函数,可选地通过回调函数和进程数量进行过滤,它在我的 Mac 上的 Lion 上运行良好:
这是一个使用匿名函数调用它的示例,并且在 php 5.3 中限制为 64 个线程:
输出是一个最多 128 个数字的序列,然后是大约 128 个时间戳,具体取决于时钟精度以及其他一些进程是否完成。如果出现问题,过滤器可以方便地在中途退出。
您可以尝试将进程限制从 64 更改为 1 以查看连续到达的结果,或者注释掉 $key == 128 行以防止停止。如果您没有设置进程数限制,它会尽可能多地打开进程的文件句柄,并等待更多的文件句柄在内部可用。
它的工作方式是,它几乎与 shell_exec() 相同,但在后台启动进程并继续执行。如果您通过关闭句柄过早地关闭进程,它将有关损坏管道的任何警告传递给 null。
我的问题是,我需要让它跨平台,但不能轻松访问 PC 或 Windows 的所有风格,如 NT。这是我的 TODO 清单:
- fread() 在 Windows 上阻塞,因为 stream_set_blocking() 是 NOP。也许可以用 fread(1) 解决这个问题,但它只是伪抢先的。需要一种方法来查看是否有字节在等待,可能是通过选择或以某种不同的方式使流非阻塞。
- 在后台生成进程,可能使用“START /B [command]”。这确实需要与 unix 中的“&”类似地工作,并且不生成额外的输出,阻止粗壮或强制它只能通过文件访问,强制用户创建批处理文件或其他奇怪的东西。它可能需要使用 proc_ open() 或 pcntl_fork() 或完全不同的东西,我不太确定。
- 探索使用 curl_multi 或其他线程工具来生成函数并像往常一样在其中调用 shell_exec() (这需要以不涉及安装任何额外库的方式完成)。
- 使用像 DIRECTORY_SEPARATOR == '\' 这样的良好测试在 Windows 上运行单独的代码分支。
- 在 Windows 上需要一些更好的测试用例,可能是 "TIMEOUT [seconds]" 或 "PING -n [milliseconds] 127.0.0.1>nul" 没有输出。
这一切都开始了,因为我试图在 php 中模拟goroutine之类的东西,您可以在其中生成最多 N 个进程,如果达到限制,它只会阻塞,直到有更多可用,然后返回结果。我一直需要加速应该很容易并行化的大型任务,但是 php 使这变得困难,因为由于一堆特定于操作系统的细节,他们的手被束缚了。
所以我认为无论谁想出了这个函数的可靠跨平台版本,或者非常类似于“正常工作”的 goroutine 的东西,都会发现他们的代码非常受欢迎。我的猜测是这个函数现在回退到在 Windows 上串行运行。
提前感谢您的帮助,祝您好运!
go - 为什么运行某些 goroutine 需要 time.sleep?
在 GO 教程中,我们有这张幻灯片:Goroutines
运行此代码会产生预期的结果(“world”和“hello”交替写入屏幕 5 次)。
但是,如果我们注释掉time.Sleep
(因此,"time"
导入的行)并再次运行程序,我们只剩下五次在屏幕上写入的“hello”。
time.Sleep
使goroutine 免于死亡有什么如此重要?
go - Go 频道在被阻止时是否会保持秩序?
我有一部分频道都收到相同的消息:
但是,由于其中的每个频道chans
都可能以不同的速率被读取,所以当我遇到一个缓慢的消费者时,我不想阻止其他频道。我已经用 goroutines 解决了这个问题:
但是,传递到每个通道的消息的顺序很重要。我查看了规范以查看通道在被阻塞时是否保持顺序,我发现的只是:
如果容量大于零,则通道是异步的:如果缓冲区未满(发送)或非空(接收),则通信操作成功而不会阻塞,并且元素按发送顺序接收。
对我来说,如果写入被阻止,那么它不是“发送”,而是等待发送。有了这个假设,上面没有说明当多个 goroutine 被阻塞时的发送顺序。
通道畅通后,发送顺序是否有任何保证?
go - 如何将 MongoDB 数据库传递给 GO 例程?
我是 Go 新手,我正在尝试编写一个简单的程序,该程序迭代 MongoDB 数据库中的所有用户,并使用“mgo”包为每个用户迭代他的所有帖子。
这工作得很好,但是如果我尝试将调用更改为handleUser(db, &result)
handleUsergo handleUser(db, &result)
中的第二个查询,则不会执行任何操作。
我怀疑会话已经关闭,因为“主要”已经完成,对吗?如果是这样,处理这种情况的方法是什么?