Her 10 ms'de bir periyodik erlang işlemi yapmak istiyorum (duvar saatine göre), 10ms mümkün olduğunca doğru olmalıdır; uygulamak için doğru yol ne olmalıdır?Erlang Süreci, Kesin Süre ile (örneğin 10 ms) periyodik olarak nasıl çalıştırılır?
cevap
. Eğer metodu Stratus3D'un answer numaralı telefonunda kullanırsanız sonunda geride kalacaksınız.
start_link(Period) when Period > 0, is_integer(Period) ->
gen_server:start_link({local, ?SERVER}, ?MODULE, Period, []).
...
init(Period) ->
StartT = erlang:monotonic_time(millisecond),
self() ! tick,
{ok, {StartT, Period}}.
...
handle_info(tick, {StartT, Period} = S) ->
Next = Period - (erlang:monotonic_time(millisecond)-StartT) rem Period,
_Timer = erlang:send_after(Next, self(), tick),
do_task(),
{ok, S}.
Sen kabuğunda test edebilirsiniz:
spawn(fun() ->
P = 1000,
StartT = erlang:monotonic_time(millisecond),
self() ! tick,
(fun F() ->
receive
tick ->
Next = P - (erlang:monotonic_time(millisecond)-StartT) rem P,
erlang:send_after(Next, self(), tick),
io:format("X~n", []),
F()
end
end)()
end).
Gerçekten olabildiğince kesin olmak istiyorsanız ve görevinizin gerçekleştirilmesini istediğiniz aralıktan daha az zaman alacağından eminseniz, her 10 ms'de bir işlem oluşturmak yerine uzun bir işlem gerçekleştirebilirsiniz. Erlang her 10 ms'de yeni bir süreç açabilir ama aynı süreci tekrar kullanamayacağınız bir sebep olmadıkça, genellikle (her ne kadar çok az olsa da) yükü almaya değmez.
Bir OTP gen_server böyle bir şey yapacağını: gen_server çalıştığı gibi o kadar ebeveyn olacak çökerse (sürece
periodic_task:start_link().
: Sonra böyle gen_server başlatmak
-module(periodic_task).
... module exports
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
... Rest of API and other OTP callbacks
init([]) ->
Timer = erlang:send_after(0, self(), check),
{ok, Timer}.
handle_info(check, OldTimer) ->
erlang:cancel_timer(OldTimer),
Timer = erlang:send_after(10, self(), check),
do_task(), % A function that executes your task
{noreply, Timer}.
Bağlantılı olduklarından dolayı işlem) do_task/0
işlevi neredeyse her 10 milisaniyede bir gerçekleştirilecektir. Bunun kusursuz olmayacağını unutmayın. İcra sürelerinde bir sapma olacak. Gerçek aralık, 10 ms + zamanlayıcı mesajını alacak, eski zamanlayıcıyı iptal edecek ve yenisini başlatacaktır.
Her 10 ms'de bir ayrı bir işlem başlatmak isterseniz, do_task/0
bir işleme sahip olabilirsiniz. Bunun ek yükü ekleyeceğini, ancak spawns arasındaki aralığı daha az kesinleştirmeyeceğini unutmayın.
Benim örnekte, bu cevap alındı: Eğer erlang:monotonic_time/0,1
kullanarak gerçek duvar saati zamanında güvenmelisiniz gerçekten güvenilir ve doğru periyodik süreç istiyorsanız What's the best way to do something periodically in Erlang?
- 1. Erlang ve MS SQL Server
- 2. Uzun süre çalışan Django süreci uygulanabilir mi?
- 3. Windows 10 IOT uygulaması yerel olarak nasıl çalıştırılır?
- 4. Windows 10 üzerinde jigdo nasıl çalıştırılır
- 5. Windows Phone 10 Emulator nasıl çalıştırılır?
- 6. Android'de gps konumunu periyodik olarak nasıl bulurum?
- 7. Erlang'ın gen_server ile periyodik olarak eylemler nasıl gerçekleştirilir?
- 8. MySQL veritabanının periyodik olarak yedeklenmesi
- 9. GeoLiteCity.dat'ı periyodik olarak güncellemeli miyim?
- 10. MS Powerpack 10'u nerede bulabilirim?
- 11. Nasıl System.Diagnostics.Process bir süreci durdurmak ve
- 12. JSF, ajax ile periyodik olarak bir bileşeni yenilemek?
- 13. Flask'tan periyodik olarak güncelleme ve işleme
- 14. Setq etkileşimli olarak nasıl çalıştırılır
- 15. PyCharm ile Pylint nasıl çalıştırılır
- 16. tensorflow cifar-10 değerlendirme, örneğin SoftMax çıkış
- 17. Kesin Subimplicits
- 18. Poll SCM ile Jenkins arasında periyodik olarak yapılan fark nedir?
- 19. Kesin frekanslar nasıl yanıp söndürülür?
- 20. Test Süreci. Başlatma?
- 21. Erlang alma mesajı - dahili olarak nasıl yapılır?
- 22. Erlang uygulamasında bir Erlang uygulaması nasıl çalışır
- 23. Erlang ile HTML Ayrıştırma
- 24. Redis periyodik olarak yüksek yükte yanıt vermiyor
- 25. Android'in animTime sabitleri için gerçek ms süre değerleri nelerdir?
- 26. Yapılandırma dosyası erlang ile nasıl ayrıştırılır?
- 27. Karmaşık senkronizasyon süreci nasıl kaydedilir?
- 28. Erlang: Gerekli tüm uygulamaları otomatik olarak uygulamaya nasıl başlatabilirim?
- 29. Periyodik olarak Embedded H2 veritabanını sıfırlayın
- 30. HM-10 CC2541 IBeacon - rastgele bir süre sonra uyku sorunu
bu yöntemle güzel bir şey küçük kaçınılmaz hatalar zaman içinde birikir kalmamasıdır. – Pascal