问题标签 [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.

0 投票
3 回答
1401 浏览

multithreading - 为什么我的 goroutine 相互等待而不是在完成后完成?

我对 Go 很陌生,我的代码中有一件事我不明白。我写了一个简单的冒泡排序算法(我知道它不是很有效;))。现在我想启动 3 个 GoRoutines。每个线程都应该独立于其他线程对他的数组进行排序。完成后,函数。应该打印一个“完成”的消息。

这是我的代码:

这就是我得到的:

线程 2 不应该先完成,因为他的切片是最小的吗?似乎所有线程都在等待其他线程完成,因为“完成”消息同时出现,无论切片有多大..

我的脑虫在哪里?=)

提前致谢。

*编辑:将“time.Sleep(1)”放入bubblesort func的for循环中时。它似乎工作..但我想用这段代码记录不同机器上的持续时间(我知道,我必须改变随机的东西),所以睡眠会伪造结果。

0 投票
2 回答
1621 浏览

windows - 简单的 goroutine 在 Windows 上不起作用

我正在用 goroutine 做一些测试,只是为了了解它们是如何工作的,但它们似乎根本没有运行。我做了一个非常简单的测试:

我希望这会打印“测试”,但它根本不做任何事情,没有消息但也没有错误。我还尝试for {}在程序末尾添加 a 以让 goroutine 有时间打印一些东西,但这并没有帮助。

知道可能是什么问题吗?

0 投票
3 回答
13718 浏览

concurrency - 多个 goroutine 打印到标准输出是否安全?

我的程序中有多个 goroutine,每个 goroutine 都在fmt.Println没有任何显式同步的情况下调用。这是安全的(即,每一行是否会单独出现而不会损坏数据),还是我需要创建另一个具有同步功能的 goroutine 来专门处理打印?

0 投票
1 回答
1928 浏览

go - 有更好的方法来跟踪 goroutine 响应吗?

我正试图了解 goroutines。我创建了一个简单的程序,可以跨多个搜索引擎并行执行相同的搜索。目前,为了跟踪回复的数量,我计算了我收到的数量。不过好像有点业余。

有没有更好的方法来知道我何时收到了以下代码中所有 goroutine 的响应?

0 投票
1 回答
262 浏览

go - Go中的死锁,两个例程拆分工作

我在 go 中遇到了一个死锁问题。

该程序接受一个整数数组 a,并将其分成两部分。然后它将这两个部分放在两个不同的例程中并总结所有元素。在此之后,它应该在通道 res 中发送两个结果。然后应该将两个 res(现在是 ch)加在一起并打印。

我的问题:我试图通过大量移动关闭函数来解决死锁问题,但似乎没有任何帮助。显然,它只适用于一个例程 Add 运行。

0 投票
0 回答
389 浏览

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 上串行运行。

提前感谢您的帮助,祝您好运!

0 投票
6 回答
85891 浏览

go - 多个 goroutine 在一个通道上监听

我有多个 goroutines 试图同时在同一个频道上接收。似乎最后一个开始在通道上接收的 goroutine 获得了值。这是语言规范中的某个地方还是未定义的行为?

输出:

操场上的例子

编辑:

我才意识到这比我想象的要复杂。消息在所有 goroutine 中传递。

输出:

注意: 上述输出在最新版本的 Go 中已经过时(见评论)

操场上的例子

0 投票
3 回答
19081 浏览

go - 为什么运行某些 goroutine 需要 time.sleep?

在 GO 教程中,我们有这张幻灯片:Goroutines

运行此代码会产生预期的结果(“world”和“hello”交替写入屏幕 5 次)。

但是,如果我们注释掉time.Sleep(因此,"time"导入的行)并再次运行程序,我们只剩五次在屏幕上写入的“hello”。

time.Sleep使goroutine 免于死亡有什么如此重要?

0 投票
4 回答
1669 浏览

go - Go 频道在被阻止时是否会保持秩序?

我有一部分频道都收到相同的消息:

但是,由于其中的每个频道chans都可能以不同的速率被读取,所以当我遇到一个缓慢的消费者时,我不想阻止其他频道。我已经用 goroutines 解决了这个问题:

但是,传递到每个通道的消息的顺序很重要。我查看了规范以查看通道在被阻塞时是否保持顺序,我发现的只是:

如果容量大于零,则通道是异步的:如果缓冲区未满(发送)或非空(接收),则通信操作成功而不会阻塞,并且元素按发送顺序接收。

对我来说,如果写入被阻止,那么它不是“发送”,而是等待发送。有了这个假设,上面没有说明当多个 goroutine 被阻塞时的发送顺序。

通道畅通后,发送顺序是否有任何保证?

0 投票
1 回答
1648 浏览

go - 如何将 MongoDB 数据库传递给 GO 例程?

我是 Go 新手,我正在尝试编写一个简单的程序,该程序迭代 MongoDB 数据库中的所有用户,并使用“mgo”包为每个用户迭代他的所有帖子。

这工作得很好,但是如果我尝试将调用更改为handleUser(db, &result)handleUsergo handleUser(db, &result)中的第二个查询,则不会执行任何操作。

我怀疑会话已经关闭,因为“主要”已经完成,对吗?如果是这样,处理这种情况的方法是什么?