সুতরাং আসুন আমি বলি যে আমি একগুচ্ছ ইমেল প্রেরণ করতে চাইছি বা সাইটম্যাপটি পুনরায় তৈরি করতে চাইছি বা প্রতি 4 ঘন্টা অন্তর যাই হোক না কেন, আমি কীভাবে এটি ফিনিক্সে বা এলিক্সির সাথে করব?
সুতরাং আসুন আমি বলি যে আমি একগুচ্ছ ইমেল প্রেরণ করতে চাইছি বা সাইটম্যাপটি পুনরায় তৈরি করতে চাইছি বা প্রতি 4 ঘন্টা অন্তর যাই হোক না কেন, আমি কীভাবে এটি ফিনিক্সে বা এলিক্সির সাথে করব?
উত্তর:
একটি সহজ বিকল্প আছে যা কোনও বাহ্যিক নির্ভরতা প্রয়োজন হয় না:
defmodule MyApp.Periodically do
use GenServer
def start_link do
GenServer.start_link(__MODULE__, %{})
end
def init(state) do
schedule_work() # Schedule work to be performed at some point
{:ok, state}
end
def handle_info(:work, state) do
# Do the work you desire here
schedule_work() # Reschedule once more
{:noreply, state}
end
defp schedule_work() do
Process.send_after(self(), :work, 2 * 60 * 60 * 1000) # In 2 hours
end
end
এখন আপনার তত্ত্বাবধানে গাছ:
worker(MyApp.Periodically, [])
Process.send_after
নিজস্ব ক্রিয়ায় না নেওয়ার জন্য যাতে ফাংশনটি উভয় থেকেই বলা যেতে পারে init
এবং handle_info
?
:timer.send_interval
ঠিক আছে তবে মনে রাখবেন যে অন্তরগুলি স্থির থাকবে will সুতরাং কল্পনা করুন আপনি প্রতি মিনিটে কিছু করতে চান এবং ভবিষ্যতে, কাজটি নিজেই এক মিনিটেরও বেশি সময় নেয়। এই জাতীয় পরিস্থিতিতে আপনি সর্বদা কাজ করে যাবেন এবং আপনার বার্তার সারি সীমাহীন হয়ে উঠবে। উপরের সমাধানটি কাজ শেষ হওয়ার পরে প্রদত্ত সময়কালের জন্য সর্বদা অপেক্ষা করবে ।
কোয়ান্টাম আপনাকে রানটাইমে কাজ তৈরি করতে, সন্ধান করতে এবং মুছতে দেয়।
তদ্ব্যতীত, ক্রোনজব তৈরি করার সময় আপনি টাস্ক ফাংশনে আর্গুমেন্টগুলি পাস করতে পারেন এবং আপনি যদি ইউটিসির সাথে খুশি না হন তবে সময় অঞ্চলটিও সংশোধন করতে পারেন।
যদি আপনার অ্যাপ্লিকেশনটি একাধিক বিচ্ছিন্ন দৃষ্টান্ত হিসাবে চলমান (যেমন হেরোকু), সেখানে পোস্টগ্রেএসকিউএল বা রেডিসের সহায়ত এমন জব প্রসেসর রয়েছে যা কার্যের সময়সূচী সমর্থন করে:
ওবান: https://github.com/sorentwo/oban
Exq: https://github.com/akira/exq
টনিক: https://github.com/joakimk/toniq
ভার্ক: https://github.com/edg ګرl/verk
আপনি এর জন্য ইরলক্রন ব্যবহার করতে পারেন । আপনি এটি পছন্দ মত
job = {{:weekly, :thu, {2, :am}},
{:io, :fwrite, ["It's 2 Thursday morning~n"]}}
:erlcron.cron(job)
এ job
একটি 2-উপাদান টিপল। প্রথম উপাদানটি এমন একটি টুপল যা কাজের সময়সূচী উপস্থাপন করে এবং দ্বিতীয় উপাদানটি হ'ল ফাংশন বা একটি এমএফএ (মডিউল, ফাংশন, আরটি)। উপরের উদাহরণে, আমরা :io.fwrite("It's 2 Thursday morning")
প্রতি বৃহস্পতিবার 2 টা চলি ।
আশা করি এইটি কাজ করবে!
আমি কোয়ান্টাম লাইব্রেরি কোয়ান্টাম- এলিক্সির ব্যবহার করেছি ।
নীচের নির্দেশাবলী অনুসরণ করুন।
#your_app/mix.exs
defp deps do
[{:quantum, ">= 1.9.1"},
#rest code
end
#your_app/mix.exs
def application do
[mod: {AppName, []},
applications: [:quantum,
#rest code
]]
end
#your_app/config/dev.exs
config :quantum, :your_app, cron: [
# Every minute
"* * * * *": fn -> IO.puts("Hello QUANTUM!") end
]
সব সেট. কমান্ডের নীচে চালিয়ে সার্ভারটি শুরু করুন।
iex -S mix phoenix.server
আমি খুঁজে :timer.send_interval/2
সামান্য বেশি একটি সঙ্গে ব্যবহার করার জন্য কর্মদক্ষতার GenServer
চেয়ে Process.send_after/4
(ব্যবহৃত গৃহীত উত্তর )।
প্রতিবার আপনি যখন এটিটি পরিচালনা করেন তখন আপনার বিজ্ঞপ্তিটি পুনরায় নির্ধারণের পরিবর্তে :timer.send_interval/2
একটি বিরতি সেট করে যা আপনি অনন্তভাবে একটি বার্তা পান schedule_work()
the গৃহীত উত্তর ব্যবহারের মতো কল করার দরকার নেই ।
defmodule CountingServer do
use GenServer
def init(_) do
:timer.send_interval(1000, :update)
{:ok, 1}
end
def handle_info(:update, count) do
IO.puts(count)
{:noreply, count + 1}
end
end
প্রতি 1000 এমএস (অর্থাত্ একবারে দ্বিতীয়) IntervalServer.handle_info/2
বলা হবে, বর্তমান মুদ্রণ করুন count
এবং জেনার সার্ভারের রাজ্য আপডেট করুন ( count + 1
) আপনাকে এর ফলাফল প্রদান করবে:
1
2
3
4
[etc.]
ব্যবহারের পাশাপাশি Process.send_after
, আপনি এটি ব্যবহার করতে পারেন : টাইমআর অ্যাপ্লিকেশন_আরন্টারভাল ।
কোয়ান্টাম দুর্দান্ত, আমরা এটি ফিনিক্সের ফ্রন্ট-এন্ডের সাথে ক্রোন রিপ্লেসমেন্ট হিসাবে কাজে ব্যবহার করি এবং আমরা রিয়েল-টাইমে কাজও যোগ করি যা খুব ঝরঝরে।