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

برای اینکه بفهمید یک فرآیند در اکسیر چیست، ابتدا باید بدانید که یک تابع چیست.
مثلا، 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
.
در نتیجه: یک فرآیند در اکسیر یک واحد پردازش است که یک عملکرد را انجام می دهد.