এলিক্সির বা ফিনিক্স ফ্রেমওয়ার্কে প্রতি কয়েক ঘন্টা চালানোর জন্য আমি কীভাবে কোডটি শিডিউল করতে পারি?


194

সুতরাং আসুন আমি বলি যে আমি একগুচ্ছ ইমেল প্রেরণ করতে চাইছি বা সাইটম্যাপটি পুনরায় তৈরি করতে চাইছি বা প্রতি 4 ঘন্টা অন্তর যাই হোক না কেন, আমি কীভাবে এটি ফিনিক্সে বা এলিক্সির সাথে করব?

উত্তর:


387

একটি সহজ বিকল্প আছে যা কোনও বাহ্যিক নির্ভরতা প্রয়োজন হয় না:

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, [])

168
এই ভাষাটি না ভালবাসা অসম্ভব :)
NoDisplayName

3
আমার এই ফাইলটি কোথায় রাখা উচিত? লিনিক / ফিনিক্স প্রকল্পের ডিরেক্টরি অধীনে? পরীক্ষা / পর্যায়ক্রমে / * পরীক্ষা কোথায় যায়?
EugZol

9
লিব এ কারণ এটি একটি দীর্ঘ চলমান প্রক্রিয়া। আপনি যা পরীক্ষা করে তা বোধগম্য করতে পারেন, সম্ভবত "টেস্ট / মাই_এপ / পর্যায়ক্রমে_প্রেম.একএস"।
জোসে ভলিম

2
কোনও নির্দিষ্ট কারণের Process.send_afterনিজস্ব ক্রিয়ায় না নেওয়ার জন্য যাতে ফাংশনটি উভয় থেকেই বলা যেতে পারে initএবং handle_info?
রায়ান বিগ

24
@ কোডিপল :timer.send_intervalঠিক আছে তবে মনে রাখবেন যে অন্তরগুলি স্থির থাকবে will সুতরাং কল্পনা করুন আপনি প্রতি মিনিটে কিছু করতে চান এবং ভবিষ্যতে, কাজটি নিজেই এক মিনিটেরও বেশি সময় নেয়। এই জাতীয় পরিস্থিতিতে আপনি সর্বদা কাজ করে যাবেন এবং আপনার বার্তার সারি সীমাহীন হয়ে উঠবে। উপরের সমাধানটি কাজ শেষ হওয়ার পরে প্রদত্ত সময়কালের জন্য সর্বদা অপেক্ষা করবে ।
জোসে ভালিম

33

কোয়ান্টাম আপনাকে রানটাইমে কাজ তৈরি করতে, সন্ধান করতে এবং মুছতে দেয়।

তদ্ব্যতীত, ক্রোনজব তৈরি করার সময় আপনি টাস্ক ফাংশনে আর্গুমেন্টগুলি পাস করতে পারেন এবং আপনি যদি ইউটিসির সাথে খুশি না হন তবে সময় অঞ্চলটিও সংশোধন করতে পারেন।

যদি আপনার অ্যাপ্লিকেশনটি একাধিক বিচ্ছিন্ন দৃষ্টান্ত হিসাবে চলমান (যেমন হেরোকু), সেখানে পোস্টগ্রেএসকিউএল বা রেডিসের সহায়ত এমন জব প্রসেসর রয়েছে যা কার্যের সময়সূচী সমর্থন করে:

ওবান: https://github.com/sorentwo/oban

Exq: https://github.com/akira/exq

টনিক: https://github.com/joakimk/toniq

ভার্ক: https://github.com/edg ګرl/verk


1
আমি মনে করি এটি অনেক সাধারণ কাজের জন্য একটি ওভারকিল হবে যার প্রয়োজন নেই তবে যাইহোক উত্তরটির জন্য আপনাকে ধন্যবাদ।
NoDisplayName

উপলব্ধ গ্রন্থাগারের তালিকা থাকা আমার পক্ষে সহায়ক।
sheldonkreger

24

আপনি এর জন্য ইরলক্রন ব্যবহার করতে পারেন । আপনি এটি পছন্দ মত

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 টা চলি ।

আশা করি এইটি কাজ করবে!


হ্যাঁ এটি কিছুই চেয়ে ভাল, আপনাকে ধন্যবাদ। আমি কিছুক্ষণের জন্য প্রশ্নটি
উত্তরহীন রেখে

4
আপনাকে স্বাগতম! এর রয়েছে github.com/c-rack/quantum-elixir , যা একটি স্পর্শমণি liberal এর সংক্ষিপ্ত রূপ হল আপনি যদি চান
Gjaldon

6

আমি কোয়ান্টাম লাইব্রেরি কোয়ান্টাম- এলিক্সির ব্যবহার করেছি ।
নীচের নির্দেশাবলী অনুসরণ করুন।

#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 

এটি ক্রোনজবসের মতো
ডার্কব্লেজার

1

আমি খুঁজে :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.]


0

কোয়ান্টাম দুর্দান্ত, আমরা এটি ফিনিক্সের ফ্রন্ট-এন্ডের সাথে ক্রোন রিপ্লেসমেন্ট হিসাবে কাজে ব্যবহার করি এবং আমরা রিয়েল-টাইমে কাজও যোগ করি যা খুব ঝরঝরে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.