init()函数可以安全地启动例程,包括进行测试吗?

我有一个应用。 会创建一个HTTP服务来侦听我们可以用来检查应用状态的几个连接点。</ p>

该服务在后台运行(带有go例程)。</ p> \ n

除其他外,它在 init()</ code>函数中初始化:</ p>

  func init(){
...

initHttpEndPoints();
...
}
</ code> </ pre>

可以在 init()中创建go例程的事实</ </ code>函数在测试此应用程序时会导致问题。?</ p>

我问是因为看起来我的测试第二次重新运行了 init()</ code>并 我想知道为什么会这样,并且会有什么副作用...(如果所有go例程突然重复,可能不太好。)</ p>

注意 :完整的应用程序。 在 init()</ code>函数中创建数百个go例程。 我以HTTP端点为例。</ em> </ p>

完全相关的答案:测试是否同时运行? </ p>
</ div>

展开原文

原文

I have an app. which creates an HTTP service to listen to a few connections points we can use to check the app status.

That service runs in the background (with a go routine).

It gets initialized in the init() function among other things:

func init() {
    ...
    initHttpEndPoints();
    ...
}

Can the fact that a go routine is created in the init() function cause issues when testing this app.?

I'm asking because it looks like my tests re-run the init() a second time and I'm wondering why that is and what the side effects could be... (probably not so good if all the go routines are all of a sudden duplicated.)

Note: The complete app. creates several hundred go routines in the init() function. I use the HTTP end point as an example.

Strongly related answer: Are tests run concurrently?

2个回答



除了icza的回答,听起来好像您在 init()</ code>中错误地使用了测试</ code>包。</ p>

而不是使用 init()</ code>初始化测试所需的内容,而是应定义函数 TestMain()</ code> 。</ p>
</ div>

展开原文

原文

In addition to icza's answer, it sounds like you're using init() incorrectly with the testing package.

Rather than using init() to initialize things needed for tests, you should define the function TestMain().

duanbenzan4050
duanbenzan4050 我不是该应用的第一作者。 我只是跟着那里的东西。 但是你是对的。 我将调用从init()移到main()并删除了init()函数。 现在,我的测试中有一个TestMain()函数,该函数运行该测试所需的很少的初始化函数。 它已经好得多了!
大约一年之前 回复



规范: 程序包初始化: </ p>


程序包初始化-变量初始化和init函数的调用-一次在单个goroutine中依次出现一个程序包。 init函数可能会启动其他goroutine,这些goroutine可以与初始化代码同时运行。</ strong>但是,初始化总是对init函数进行排序:在前一个返回之前,它不会调用下一个。</ p >
</ blockquote>

init()</ code>函数启动goroutine并没有错,尽管您必须记住这些goroutine在初始化过程中同时运行,所以对于 例如,您不能假设有关(当前)程序包的初始化状态。</ p>

如果看到您的 init()</ code>函数多次运行,那就是 最有可能的是,多个测试分别运行。 init()</ code>函数在包的生存期内仅运行一次。</ p>
</ div>

展开原文

原文

Spec: Package initialization:

Package initialization—variable initialization and the invocation of init functions—happens in a single goroutine, sequentially, one package at a time. An init function may launch other goroutines, which can run concurrently with the initialization code. However, initialization always sequences the init functions: it will not invoke the next one until the previous one has returned.

There is nothing wrong about launching goroutines from init() functions, although you must remember that these goroutines run concurrently with the initialization process, so for example you can't assume anything about the initialization state of the (current) package.

If you see your init() functions running multiple times, that is most likely multiple tests run separately. init() functions run only once during the lifetime of a package.

dongshengheng1013
dongshengheng1013 或者启动的goroutine本身会对其进行初始化...
大约一年之前 回复
dongqing483174
dongqing483174 请注意,我只有一个应用程序,没有软件包。 我有一个init()和main()。 但是我想这是个好主意:您必须确保go例程要使用的所有内容在启动它之前已经初始化(或具有某种同步机制)。
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐