برنامه نویسی

ماژول Elixir Agent – یک راه ساده برای به اشتراک گذاری داده ها بین فرآیندها بدون اجرای فرآیند ما یا GenServer

Summarize this content to 400 words in Persian Lang

مقدمه

برای تازه‌کارانی که به تازگی به سراغ اکسیر رفته‌اند، درک کامل فرآیند اکسیر دشوار است (همچنین GenServer). برای سهولت کار با فرآیند، اکسیر فراهم می کند Agent ماژول برای پشتیبانی از اشتراک گذاری داده ها (وضعیت) بین دو یا چند فرآیند.

توضیح

در اکسیر، هر خط کد در یک فرآیند اجرا می شود و چون اکسیر برنامه نویسی کاربردی است، پس متغیر جهانی نداریم (البته یک فایده بزرگ در این مورد داریم، عارضه جانبی بسیار کمتر از اجتناب از استفاده از متغیر جهانی است) .

برای به اشتراک گذاری داده ها بین توابع از فرهنگ لغت فرآیند یا متغیر پاس به عنوان پارامتر استفاده می کنیم.

اما برای بین فرآیندهای مختلف ما به تلاش بیشتری برای به اشتراک گذاری داده ها نیاز داریم (اگر از جدول Ets و :persistent_term – راه محدود). برای ارسال و دریافت پیام نیاز به کد اضافه داریم، همچنین باید حالت را برای ذخیره متغیر سراسری کنترل کنیم (می توان از فرهنگ لغت پردازش استفاده کرد).

برای به اشتراک گذاری داده ها بین فرآیند بسیار راحت تر می توانیم استفاده کنیم Agent برای نگهداری داده های جهانی (وضعیت) برای به اشتراک گذاشتن بین فرآیندها یا ساده بین توابع در یک فرآیند.

یک عامل را پیاده سازی کنید

ما می توانیم با استفاده از یک ماژول پیاده سازی کنیم Agent یا به طور مستقیم (کمتر راحت).

defmodule AutoId do
use Agent

def start_link(initial_id) do
Agent.start_link(fn -> initial_value end, name: __MODULE__)
end

def last_id do
Agent.get(__MODULE__, & &1)
end

def set_id(new_id) do
Agent.update(__MODULE__, &(&1 + new_id))
end

def new_id do
Agent.get_and_update(__MODULE__, fn id -> {id, id + 1} end)
end
end

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مثال، ما یک ماژول برای به اشتراک گذاشتن راهی برای دریافت شناسه منحصر به فرد برای تمام فرآیندهای سیستم با تماس ایجاد می کنیم AudoId.new_id().می‌توانیم با تماس به یک سرپرست برنامه یا شروع دستی اضافه کنیم AutoId.start_link(0) قبل از استفاده (به یاد داشته باشید اگر فرآیند ما از کار بیفتد، Agent Process خراب می شود).

برای افزودن یک ناظر برنامه (یا سرپرست ما) کدهایی مانند:

children = [
{AutoId, 0}
]

Supervisor.start_link(children, strategy: :one_for_one)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای راهنمای شروع AutoId فرآیند فقط کدهایی مانند:

AutoId.start_link(1_000)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و جایی که بتوانیم با تماس از آن استفاده کنیم AutoId توابع مانند:

my_id = AutoId.new_id()

#…

# reset id
AutoId.set_id(1_000_000)

other_id = AutoId.new_id()

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Agent به اندازه کافی ساده برای استفاده است و ما نیازی به پیاده سازی نداریم GenServer یا فرآیند جدیدی برای اشتراک گذاری داده بنویسید.

Agent فرآیند است، سپس می‌توان آن را تحویل داد یا اضافه بار، زیرا در صورت نیاز به دریافت/تنظیم داده‌ها (وضعیت) در زمان محدود، می‌توانیم از آن استفاده کنیم. timeout پارامتر (پیش‌فرض 5_000 میلی‌ثانیه است).

Agent همچنین پیکربندی را برای child_spec برای سرپرست مانند GenServer و پشتیبانی توزیع شده، مبادله کد داغ برای موارد استفاده بیشتر.

مقدمه

برای تازه‌کارانی که به تازگی به سراغ اکسیر رفته‌اند، درک کامل فرآیند اکسیر دشوار است (همچنین GenServer). برای سهولت کار با فرآیند، اکسیر فراهم می کند Agent ماژول برای پشتیبانی از اشتراک گذاری داده ها (وضعیت) بین دو یا چند فرآیند.

توضیح

در اکسیر، هر خط کد در یک فرآیند اجرا می شود و چون اکسیر برنامه نویسی کاربردی است، پس متغیر جهانی نداریم (البته یک فایده بزرگ در این مورد داریم، عارضه جانبی بسیار کمتر از اجتناب از استفاده از متغیر جهانی است) .

برای به اشتراک گذاری داده ها بین توابع از فرهنگ لغت فرآیند یا متغیر پاس به عنوان پارامتر استفاده می کنیم.

اما برای بین فرآیندهای مختلف ما به تلاش بیشتری برای به اشتراک گذاری داده ها نیاز داریم (اگر از جدول Ets و :persistent_term – راه محدود). برای ارسال و دریافت پیام نیاز به کد اضافه داریم، همچنین باید حالت را برای ذخیره متغیر سراسری کنترل کنیم (می توان از فرهنگ لغت پردازش استفاده کرد).

برای به اشتراک گذاری داده ها بین فرآیند بسیار راحت تر می توانیم استفاده کنیم Agent برای نگهداری داده های جهانی (وضعیت) برای به اشتراک گذاشتن بین فرآیندها یا ساده بین توابع در یک فرآیند.

یک عامل را پیاده سازی کنید

ما می توانیم با استفاده از یک ماژول پیاده سازی کنیم Agent یا به طور مستقیم (کمتر راحت).

defmodule AutoId do
  use Agent

  def start_link(initial_id) do
    Agent.start_link(fn -> initial_value end, name: __MODULE__)
  end

  def last_id do
    Agent.get(__MODULE__, & &1)
  end

  def set_id(new_id) do
    Agent.update(__MODULE__, &(&1 + new_id))
  end

  def new_id do
    Agent.get_and_update(__MODULE__, fn id -> {id, id + 1} end)
  end
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مثال، ما یک ماژول برای به اشتراک گذاشتن راهی برای دریافت شناسه منحصر به فرد برای تمام فرآیندهای سیستم با تماس ایجاد می کنیم AudoId.new_id().
می‌توانیم با تماس به یک سرپرست برنامه یا شروع دستی اضافه کنیم AutoId.start_link(0) قبل از استفاده (به یاد داشته باشید اگر فرآیند ما از کار بیفتد، Agent Process خراب می شود).

برای افزودن یک ناظر برنامه (یا سرپرست ما) کدهایی مانند:

children = [
  {AutoId, 0}
]

Supervisor.start_link(children, strategy: :one_for_one)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای راهنمای شروع AutoId فرآیند فقط کدهایی مانند:

AutoId.start_link(1_000)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و جایی که بتوانیم با تماس از آن استفاده کنیم AutoId توابع مانند:

my_id = AutoId.new_id()

#...

# reset id
AutoId.set_id(1_000_000)

other_id = AutoId.new_id()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Agent به اندازه کافی ساده برای استفاده است و ما نیازی به پیاده سازی نداریم GenServer یا فرآیند جدیدی برای اشتراک گذاری داده بنویسید.

Agent فرآیند است، سپس می‌توان آن را تحویل داد یا اضافه بار، زیرا در صورت نیاز به دریافت/تنظیم داده‌ها (وضعیت) در زمان محدود، می‌توانیم از آن استفاده کنیم. timeout پارامتر (پیش‌فرض 5_000 میلی‌ثانیه است).

Agent همچنین پیکربندی را برای child_spec برای سرپرست مانند GenServer و پشتیبانی توزیع شده، مبادله کد داغ برای موارد استفاده بیشتر.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا