के साथ समय-समय पर एर्लांग प्रक्रिया कैसे चलाएं मैं हर 10ms (दीवार घड़ी के समय के आधार पर) आवधिक एरलांग प्रक्रिया को चलाने के लिए चाहता हूं, 10ms जितना संभव हो उतना सटीक होना चाहिए; इसे लागू करने का सही तरीका क्या होना चाहिए?सटीक समय (यानी 10ms)
उत्तर
तुम सच में विश्वसनीय और सटीक समय-समय पर प्रक्रिया आप erlang:monotonic_time/0,1
का उपयोग कर वास्तविक दीवार घड़ी समय पर भरोसा करना चाहिए चाहते हैं। यदि आप Stratus3D के answer में विधि का उपयोग करते हैं तो आप अंततः पीछे आ जाएंगे।
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}.
आप खोल में परीक्षण कर सकते हैं:
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).
तुम सच में संभव के रूप में सटीक होना करने के लिए चाहते हैं और आप सुनिश्चित करें कि आपके काम अंतराल आप चाहते हैं यह आप पर प्रदर्शन के बजाय एक प्रक्रिया हर 10ms को उत्पन्न करने में से एक लंबी प्रक्रिया चल हो सकता था की तुलना में कम समय लगेगा कर रहे हैं। Erlang हर 10 एमएमएस में एक नई प्रक्रिया पैदा कर सकता है, लेकिन जब तक कोई कारण नहीं है कि आप एक ही प्रक्रिया का पुन: उपयोग नहीं कर सकते हैं, यह आम तौर पर ओवरहेड के लायक नहीं है (भले ही यह बहुत छोटा हो)।
मैं एक OTP gen_server में कुछ इस तरह करना होगा: जब तक
periodic_task:start_link().
रूप gen_server चल रहा है (अगर यह दुर्घटनाओं इसलिए माता-पिता करेंगे:
-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}.
तो इस तरह gen_server शुरू प्रक्रिया से जुड़े हुए हैं) फ़ंक्शन do_task/0
लगभग हर 10 मिलीसेकंड निष्पादित किया जाएगा। ध्यान दें कि यह बिल्कुल सटीक नहीं होगा। निष्पादन समय में एक बहाव होगा। वास्तविक अंतराल 10ms + समय होगा जब यह टाइमर संदेश प्राप्त करता है, पुराने टाइमर को रद्द करता है, और नया शुरू करता है।
यदि आप प्रत्येक 10ms में एक अलग प्रक्रिया शुरू करना चाहते हैं तो आपके पास do_task/0
एक प्रक्रिया उत्पन्न हो सकती है। ध्यान दें कि यह अतिरिक्त ओवरहेड जोड़ देगा, लेकिन जरूरी नहीं कि स्पॉन्स के बीच अंतराल कम सटीक हो।
मेरे उदाहरण इस जवाब से लिया गया है: What's the best way to do something periodically in Erlang?
- 1. जावा में सटीक समय माप
- 2. पाइथन का समय कितना सटीक है। नींद()?
- 3. वेबसाइट पर सटीक स्थानीय समय प्रदर्शित करें?
- 4. 2 डेटटाइम के बीच सटीक समय?
- 5. सटीक समानता
- 6. Matrices यानी सरल पासिंग यानी। cv :: OpenCV2.4
- 7. रास्पबेरी पीआई कोई देरी नहीं (<10ms) वीडियो स्ट्रीम
- 8. फास्ट एंड सटीक पायथन दोहराना टाइमर
- 9. जावा सरणी हॉटस्पॉट में कितनी सटीक स्मृति का उपयोग करती है (यानी कितनी ढलान)?
- 10. रास्पबेरी पीआई के साथ अधिक सटीक समय उपाय कैसे प्राप्त करें?
- 11. Textarea यानी
- 12. , यानी ग्रहण
- 13. polyfill यानी
- 14. यानी ब्राउज़र पर फ़ाइल स्ट्रीम करते समय hangs
- 15. सटीक स्थिति में सटीक स्थिति क्या है?
- 16. थाइमेलीफ - फ़ॉर्मेटिंग (यानी दिनांक)
- 17. Android GPS स्थान से सटीक समय टिकटें कैसे प्राप्त करें
- 18. $ (विंडो) .scroll तेज़ स्क्रॉल करते समय सटीक नहीं है
- 19. सटीक लिनक्स समय - घड़ी_gettime() के संकल्प को निर्धारित करता है?
- 20. लिनक्स, सटीक प्रोग्राम समय की आवश्यकता है। शेड्यूलर प्रोग्राम अप
- 21. कैसे बहुत ही सटीक बीता हुआ समय सी ++
- 22. सटीक ऑफ़सेट
- 23. सटीक शून्य
- 24. सटीक स्ट्रिंग
- 25. एक्सएसएलटी यानी एक्सएमएल ट्रांसफार्मर
- 26. ReactJs + webpack + यानी + console.log
- 27. एक सटीक अवधि के लिए सोना
- 28. पायथन दशमलव सटीक
- 29. 'marshalling' शब्द की सटीक परिभाषा
- 30. यानी सशर्त टिप्पणियों स्पष्टीकरण
इस विधि के साथ अच्छी बात यह है कि छोटे अपरिहार्य त्रुटियों समय में जमा नहीं है। – Pascal