在init之前向gen_server发送消息

时间:2016-10-14 03:45:46

标签: erlang otp

我是erlang的新手,我有以下代码:

-module (test_srv).
-behaviour (gen_server).
-export ([start_link/0, init/1, handle_info/2]).

start_link() ->
  gen_server:start_link(?MODULE, [], []).

init([]) ->
  self() ! asdasd,
  {ok, new_state}.

handle_info(Msg, State) ->
  io:format("server got ~p , now state is ~p~n", [Msg, State]),
  {noreply, State}.

我在erl shell中测试:

1> {_, P} = test_srv:start_link().
server got asdasd , now state is new_state

问题是,当服务器未初始化且未读取时向服务器发送消息时,gen_server如何处理消息?我有以下猜测:

  1. gen_server会立即处理该消息,并将消息发送到handle_info回调,但会在init回调中失去初始化状态

  2. 如果没有初始化服务器,gen_server会存储消息,并在服务器初始化后发送消息。

  3. 我想知道erlang或gen_server如何处理这个问题?处理消息的原理是什么?

1 个答案:

答案 0 :(得分:4)

我猜是import regex as re import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import Spider class myspider(Spider): name = 'haha' allowed_domains = ['https://blog.scrapinghub.com/'] start_urls = ['https://blog.scrapinghub.com/'] extractor = LinkExtractor(allow=allowed_domains) def parse(self, response): # To extract all the links on this page links_in_page = self.extractor.extract_links(response) for link in links_in_page: yield scrapy.Request(link.url, callback=self.parse) 你的意思是server is not initialised函数的其余部分正在被执行。在那种情况下,你的第二个猜测是正确的确保在 init返回后{em}将执行<{1}}。由于handle_info是一个单一流程,并且您已在执行init,因此gen_server发送给自己的邮件只会在init之后由init处理已完成执行。