ماژول Elixir Agent – یک راه ساده برای به اشتراک گذاری داده ها بین فرآیندها بدون اجرای فرآیند ما یا GenServer
![ماژول Elixir Agent - یک راه ساده برای به اشتراک گذاری داده ها بین فرآیندها بدون اجرای فرآیند ما یا GenServer 1 ماژول Elixir Agent - یک راه ساده برای به اشتراک گذاری داده ها بین فرآیندها بدون اجرای فرآیند ما یا GenServer](https://nabfollower.com/blog/wp-content/uploads/2024/07/ماژول-Elixir-Agent-یک-راه-ساده-برای-به-اشتراک-780x470.png)
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
و پشتیبانی توزیع شده، مبادله کد داغ برای موارد استفاده بیشتر.