2015-07-14 18 views
8

Cách tốt nhất trong elixir để tạo ra một tiến trình nền trước đánh dấu vào mọi khoảng thời gian nhất định là gì?Cách tạo trình phát sự kiện với elixir, cách otp

Vấn đề chính của tôi là một cách tiếp cận như:

defmoulde Ticker do 
    def tick do 
    do_something() 
    :timer.sleep(1000) 
    tick 
    end 
end 

công trình, nhưng là sai do thiết kế. Nó chắc chắn không đánh dấu mỗi giây, nhưng mỗi giây CẦN thời gian cho do_something() để hoàn thành. Tôi có thể sinh ra một quá trình để xử lý "cái gì đó" nhưng vẫn còn có một độ trễ nhỏ.

Ngoài ra, tôi đang cố gắng xây dựng một ứng dụng kết hợp, có một số GenServers có liên quan, và một tiến trình nền trước chính (cái tôi đang hỏi ở đây) nên gọi các máy chủ sau mỗi x giây. Có cách nào để làm điều này?

Trả lời

13

Tôi nghĩ rằng timer:apply_interval/4 phải phù hợp với nhu cầu của bạn. Nó được sử dụng như sau:

defmodule Tick do 
    def tick do 
    IO.inspect(:tick) 
    end 
end 

:timer.apply_interval(:timer.seconds(1), Tick, :tick, []) 

Đối số theo thứ tự là khoảng thời gian, tên mô-đun, chức năng gọi và đối số để gọi. Sau đó, bạn có thể gửi tin nhắn đến GenServers bên trong chức năng đó. Kiểm tra các tài liệu hướng dẫn đầy đủ ở đây: apply_interval/4

Một điều cần xem xét là nếu chức năng tick của bạn chỉ bao giờ gửi tin nhắn đơn giản để một số GenServers sau đó nó có lẽ là cực kỳ nhanh, vì vậy thực hiện của bạn có thể là OK, một khi được bọc trong a Task và cắm vào cây giám sát (nếu bạn không quan tâm đến độ trôi nhẹ tiềm ẩn).

+1

Tôi quan tâm đến thời gian trôi dạt tiềm năng. Làm thế nào tôi có thể tránh bất kỳ thời gian trôi dạt? –

+1

'apply_interval' nên được khá phong nha, nhưng các tài liệu chỉ nói rằng" Thời gian-outs không chính xác, nhưng ít nhất là miễn là yêu cầu ". –

Các vấn đề liên quan