برنامه نویسی

فرآیند در اکسیر چیست؟

برای اینکه بفهمید یک فرآیند در اکسیر چیست، ابتدا باید بدانید که یک تابع چیست.

مثلا، IO.puts/1 تابعی است که چیزی را روی صفحه می نویسد. تابع فراخوانی می شود puts، در ماژول است IO (ورودی I و خروجی O) و آرگومان می گیرد:

iex(1)> IO.puts("Adolfo")
Adolfo
:ok
وارد حالت تمام صفحه شوید

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

اگر همه چیز خوب پیش برود، اتم را برمی گرداند :ok.
تابعی که به شما امکان می دهد (شاید ترجمه نادرست از تخمریزی، به انگلیسی) است Kernel.spawn/1.

باز هم اسمش هست spawn، بخشی از ماژول است Kernel و استدلال می کند.
من می توانم آن را انجام دهم

Kernel.spawn(IO.puts("Adolfo"))
وارد حالت تمام صفحه شوید

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

?
نه!

بیایید ساده سازی را شروع کنیم: هر تابعی که بخشی از ماژول است Kernel ابتدا به نام ماژول نیاز ندارید.
فقط تماس بگیرید

spawn(IO.puts("Adolfo"))
وارد حالت تمام صفحه شوید

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

همچنان اشتباه خواهد بود اما با حروف کمتر.
چی Kernel.spawn/1 دریافت تابعی از آریتی 0 است، یعنی هیچ آرگومانی دریافت نمی کند.
چطوری انجامش میدیم؟
مثل این:

fn -> 1 end
وارد حالت تمام صفحه شوید

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

تابع فوق نامی ندارد (ناشناس) و 1 را برمی گرداند.

اما در تصویر ببینید که اگر آن را تخم ریزی کنید، اتفاق جالبی نمی افتد:

توضیحات تصویر

ابتدا آن را ببینید

fn -> 1 end
وارد حالت تمام صفحه شوید

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

نوعی “کد” را برگرداند که تابع را شناسایی می کند:

#Function<43.3316493/0 in :erl_eval.expr/6>
وارد حالت تمام صفحه شوید

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

E

spawn(fn -> 1 end)
وارد حالت تمام صفحه شوید

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

یکی را برگرداند PID، یک شناسه فرآیند، یک شناسه فرآیند:

#PID<0.120.0>
وارد حالت تمام صفحه شوید

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

من می توانم این PID را به یک متغیر اختصاص دهم:

iex(1)> pid = spawn(fn -> 1 end)
#PID<0.110.0>
وارد حالت تمام صفحه شوید

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

و سپس بپرسید که آیا فرآیندی که تخم ریزی شده زنده است یا خیر:

iex(2)> Process.alive?(pid)
false
وارد حالت تمام صفحه شوید

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

دلیلش این نیست که تابع بسیار سریعی بود که فقط 1 را برگرداند.
به عنوان مثال می توانم فرآیند را به مدت 10 ثانیه قبل از برگرداندن 1 به حالت “خواب” درآورم.

iex(3)> pid = spawn(fn -> Process.sleep(10000); 1 end)
#PID<0.113.0>
وارد حالت تمام صفحه شوید

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

اگر سریع بپرسم که آیا فرآیندی که شناسه آن در متغیر pid است زنده است، پاسخ مثبت است.

iex(4)> Process.alive?(pid)
true
وارد حالت تمام صفحه شوید

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

اما اگر بعد از 10 ثانیه دوباره بپرسم، پاسخ منفی خواهد بود.

iex(5)> Process.alive?(pid)
false
وارد حالت تمام صفحه شوید

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

اگر این کار را اینجا انجام دهم

iex(6)> pid = spawn(fn -> Process.sleep(10000); IO.puts("Adolfo") end)
#PID<0.117.0>
Adolfo
وارد حالت تمام صفحه شوید

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

10 ثانیه طول می کشد تا «آدولفو» روی صفحه نوشته شود.

حالا اگر این کار را بکنم، فوراً «آدولفو» روی صفحه ظاهر می شود.

iex(7)> pid = spawn(fn -> IO.puts("Adolfo") end)
Adolfo
#PID<0.119.0>
وارد حالت تمام صفحه شوید

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

به هر حال، این فقط اصول اولیه است. بیشتر بخوانید در
https://elixirschool.com/pt/lessons/intermediate/concurrency
یا در شروع از زبان اکسیر
https://elixir-lang.org/getting-started/processes.html

من همه این کارها را بدون اشاره انجام دادم send ه receive.

در نتیجه: یک فرآیند در اکسیر یک واحد پردازش است که یک عملکرد را انجام می دهد.

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

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

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

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