ক্লোজার (Clojure) মাল্টি-থ্রেডেড অ্যাপ্লিকেশনের জন্য কনকারেন্সি এবং প্যারালেলিজম সহজ এবং কার্যকরভাবে সমর্থন করে। কনকারেন্সি এবং প্যারালেলিজমের মাধ্যমে একাধিক কাজ একই সময়ে করা যায়, যা কোডের কার্যক্ষমতা বাড়ায়। ক্লোজারে Atoms
, Refs
, Agents
, এবং Futures
এর মতো কনকারেন্সি কন্ট্রোল মেকানিজম রয়েছে যা ডেটা সুরক্ষা এবং থ্রেডিং ব্যবস্থাপনায় সহায়ক।
Atoms ক্লোজারে একটি সাধারণ কনকারেন্ট ডেটা কাঠামো যা ইমিউটেবল ডেটার জন্য ব্যবহৃত হয়। এটি একটি সিঙ্গেল থ্রেডেড পরিবেশে ডেটার স্টেট আপডেট করতে ব্যবহৃত হয়।
atom
ডেফাইন করা:
(def my-atom (atom 0))
swap!
দিয়ে আপডেট করা:
(swap! my-atom inc) ; মান ১ এ আপডেট হয়
(swap! my-atom + 10) ; মান ১১ এ আপডেট হয়
এখানে swap!
ফাংশনটি atom
এর মান পরিবর্তন করতে ব্যবহার করা হয়।
Refs ক্লোজারে স্টেট আপডেট করার জন্য এবং মাল্টি-থ্রেডেড পরিবেশে ডেটা সমন্বয় করতে ব্যবহৃত হয়। এটি Software Transactional Memory (STM) মডেলের মাধ্যমে ট্রানজ্যাকশনাল পদ্ধতিতে ডেটা আপডেট করে। Refs কেবল dosync
ব্লকের ভিতরে আপডেট করা যায়।
ref
ডেফাইন করা:
(def my-ref (ref 0))
dosync
এবং alter
দিয়ে আপডেট করা:
(dosync
(alter my-ref + 10))
এখানে alter
ফাংশনটি ref
আপডেট করতে ব্যবহৃত হয়, এবং এটি dosync
ব্লকের ভিতরে কাজ করে, যা একটি ট্রানজ্যাকশনাল মেমরি ব্লক।
Agents ক্লোজারে অ্যাসিঙ্ক্রোনাস ডেটা ম্যানিপুলেশনের জন্য ব্যবহৃত হয়। এটি একটি নির্দিষ্ট ফাংশনকে নির্দিষ্ট ডেটা সেটে অ্যাসিঙ্ক্রোনাসভাবে প্রয়োগ করে। যখন একাধিক থ্রেড কাজ করে, তখন Agents
ডেটা আপডেট করে এবং কোডকে ব্লক করে না।
agent
ডেফাইন করা:
(def my-agent (agent 0))
send
এবং send-off
দিয়ে আপডেট করা:
(send my-agent + 5)
এখানে send
ফাংশনটি agent
এর মান আপডেট করে এবং অ্যাসিঙ্ক্রোনাসভাবে কাজ সম্পাদন করে।
Futures
ক্লোজারে এমন একটি পদ্ধতি যা নির্দিষ্ট কাজকে ব্যাকগ্রাউন্ডে চালাতে পারে এবং তার ফলাফল পাওয়া যায় যখন এটি প্রস্তুত হয়। future
কনকারেন্ট কোড চালাতে ব্যবহৃত হয়, যা কোডের কার্যক্ষমতা বৃদ্ধি করে।
future
দিয়ে ব্যাকগ্রাউন্ড টাস্ক চালানো:
(def my-future (future (Thread/sleep 1000) (+ 1 1)))
@
দিয়ে মান প্রাপ্তি:
@my-future ; আউটপুট: ২ (১ সেকেন্ড পরে)
এখানে future
ব্যাকগ্রাউন্ডে কাজ সম্পন্ন করে এবং @
দিয়ে মান নেওয়া হয়।
একটি ব্যাংক অ্যাকাউন্ট সিমুলেট করা যাক যেখানে একটি অ্যাকাউন্ট ব্যালেন্স আপডেট করা হবে।
(def account (ref 1000))
(defn deposit [amount]
(dosync
(alter account + amount)))
(defn withdraw [amount]
(dosync
(alter account - amount)))
এখানে deposit
এবং withdraw
ফাংশন দুটি dosync
ব্লকের ভিতরে কাজ করে, যা STM ব্যবহার করে প্রতিটি ট্রানজ্যাকশন সুরক্ষিতভাবে সম্পন্ন করে।
ক্লোজারে কিছু বিল্ট-ইন ফাংশন রয়েছে যা প্যারালেল প্রসেসিং করে, যেমন pmap
, যা map
এর মতো কাজ করে কিন্তু মাল্টি-থ্রেডে কার্যকর হয়।
(defn square [n]
(* n n))
(pmap square (range 1 10))
; আউটপুট: (1 4 9 16 25 36 49 64 81)
এখানে pmap
ফাংশন square
ফাংশনকে প্যারালেল প্রসেসিং করে কাজ সম্পন্ন করে।
ক্লোজারে কনকারেন্সি এবং প্যারালেলিজম পরিচালনার জন্য Atoms
, Refs
, Agents
, এবং Futures
এর মতো শক্তিশালী টুলস রয়েছে। এই মেকানিজমগুলো ক্লোজারের ইমিউটেবল ডেটা কাঠামোর সাথে একত্রিত হয়ে ডেটা নিরাপত্তা এবং কার্যক্ষমতা বৃদ্ধি করে। Clojure এ কনকারেন্সি ও প্যারালেলিজমের এই সুবিধাগুলো ব্যবহার করে উচ্চ কার্যক্ষমতা সম্পন্ন অ্যাপ্লিকেশন তৈরি করা সম্ভব।
Concurrency (সমসাময়িকতা) হলো এমন একটি প্রোগ্রামিং কৌশল যেখানে একাধিক কাজ বা প্রসেস একই সময়ে একসঙ্গে সম্পন্ন করার চেষ্টা করা হয়। এটি একাধিক কাজের মধ্যে সামঞ্জস্য রেখে তাদেরকে কার্যকর করার পদ্ধতি, যার মাধ্যমে প্রোগ্রামের কার্যক্ষমতা ও প্রতিক্রিয়াশীলতা বাড়ানো যায়। কনকারেন্ট প্রোগ্রামিং বড় এবং জটিল সিস্টেমে কার্যকরী সমাধান দিতে পারে, বিশেষত যেখানে একাধিক কাজ দ্রুত সম্পন্ন করতে হয়।
কনকারেন্ট প্রোগ্রামিং সাধারণত মাল্টি-থ্রেডিং, অ্যাসিঙ্ক্রোনাস অপারেশন এবং প্যারালাল প্রসেসিং ব্যবহার করে। Concurrency এবং প্যারালালিজম আলাদা হলেও এই দুটি ধারণা প্রায়ই একসঙ্গে ব্যবহৃত হয়।
Concurrency এর মাধ্যমে একটি প্রোগ্রাম একাধিক কাজ একত্রে সম্পন্ন করতে পারে, যেমন ডেটা প্রক্রিয়াকরণ, নেটওয়ার্ক কমিউনিকেশন, ফাইল পড়া এবং লেখা। এর মাধ্যমে সময়ের অপচয় কমে এবং দ্রুত ফলাফল পাওয়া যায়। Concurrency মূলত নিচের কয়েকটি ধারণার ওপর ভিত্তি করে কাজ করে:
যদিও Concurrency এবং Parallelism ধারণাগুলি সম্পর্কিত, তবে এদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে।
বৈশিষ্ট্য | Concurrency | Parallelism |
---|---|---|
কাজের ধরন | একাধিক কাজের মধ্যে সামঞ্জস্য বজায় রাখা | একাধিক কাজকে সত্যিকারের একযোগে সম্পন্ন করা |
উদ্দেশ্য | কাজের অগ্রাধিকার অনুযায়ী বিভিন্ন প্রসেস চালানো | একাধিক প্রক্রিয়াকে একসাথে চালানো |
হার্ডওয়্যার | একক প্রসেসরেও সম্ভব | সাধারণত মাল্টিপ্রসেসর বা মাল্টিকোর প্রয়োজন |
Concurrency মূলত কাজের মধ্যে সামঞ্জস্য স্থাপন করে কাজ সম্পন্ন করতে সাহায্য করে, যেখানে Parallelism একাধিক প্রসেসরের সহায়তায় একসাথে কাজ করতে সক্ষম।
Concurrency প্রোগ্রামিং অনেক সুবিধা নিয়ে এলেও, এর কিছু চ্যালেঞ্জ রয়েছে:
কনকারেন্ট প্রোগ্রামিং সাধারণত কয়েকটি পদ্ধতির মাধ্যমে বাস্তবায়িত হয়:
ক্লোজার (Clojure) প্রোগ্রামিং ভাষা কনকারেন্সি প্রোগ্রামিংয়ের জন্য খুবই উপযোগী। ক্লোজারে কয়েকটি কনকারেন্সি টুল রয়েছে, যেমন:
Concurrency এমন একটি পদ্ধতি যেখানে একাধিক কাজ একই সময়ে একসাথে সম্পন্ন করার চেষ্টা করা হয়। এটি কার্যক্ষমতা বৃদ্ধি করে, তবে চ্যালেঞ্জ হিসেবে রেস কন্ডিশন এবং ডেডলকের মতো সমস্যা থাকতে পারে। ক্লোজার প্রোগ্রামিং ভাষায় Concurrency এর জন্য শক্তিশালী টুল রয়েছে, যা ডেটার নিরাপত্তা এবং স্থিতিশীলতা নিশ্চিত করে কনকারেন্ট প্রোগ্রামিংকে আরও কার্যকর করে তোলে।
Software Transactional Memory (STM) একটি উন্নত কনকারেন্ট প্রোগ্রামিং কৌশল যা মাল্টি-থ্রেডেড বা কনকারেন্ট সিস্টেমে ডেটার নিরাপত্তা ও সঙ্গতি নিশ্চিত করে। STM, ডেটার স্থিতিশীলতা বজায় রেখে একাধিক থ্রেডের মধ্যে নিরাপদ ডেটা ম্যানিপুলেশন নিশ্চিত করতে সহায়ক। এটি একটি ট্রানজ্যাকশনাল মেমরি মডেল, যেখানে ডেটার পরিবর্তনগুলি একটি অ্যাটমিক ট্রানজ্যাকশন হিসেবে সম্পাদিত হয়, যার ফলে ডেটা অবস্থান সঠিক এবং সাংকেতিক থাকে।
STM এর মূল ধারণাটি হলো ডেটার একটি গোষ্ঠীকে একযোগে একটি একক পারফেক্ট ইউনিট হিসেবে পরিচালনা করা, যাতে একাধিক থ্রেড যখন একই ডেটাকে একসাথে পরিবর্তন করতে চায়, তখন ডেটার সঙ্গতি (consistency) বজায় থাকে।
STM মূলত এমন একটি সিস্টেম যেখানে ট্রানজ্যাকশন ব্যবহৃত হয়। একটি ট্রানজ্যাকশন হল ডেটার একটি নির্দিষ্ট সেটের উপর করা কিছু অপারেশন, যা সবগুলো সফলভাবে বা কোনোটিও না করা (atomicity) হয়। যদি একটি থ্রেড ট্রানজ্যাকশন চালানোর সময় কোনো সমস্যা হয়, তাহলে সেই পরিবর্তনগুলি বাতিল (rollback) করা হয় এবং ডেটা পূর্বাবস্থায় ফিরে যায়। STM কাজ করার জন্য নিম্নলিখিত উপাদানগুলো ব্যবহার করে:
ক্লোজারে STM ব্যবহারের জন্য ref
, dosync
, এবং alter
ফাংশনগুলো ব্যবহার করা হয়। ক্লোজারে STM ব্যবহার করার প্রধান উদ্দেশ্য হচ্ছে একাধিক থ্রেড দ্বারা একই ডেটার নিরাপত্তা এবং সঙ্গতি নিশ্চিত করা।
(def counter (ref 0))
(defn increment-counter []
(dosync
(alter counter inc)))
(defn decrement-counter []
(dosync
(alter counter dec)))
; দুইটি থ্রেড একসাথে চালানো
(future (increment-counter))
(future (decrement-counter))
@counter ; আউটপুট: 0 (যেহেতু increment এবং decrement একে অপরকে বাতিল করে)
ref
দ্বারা একটি reference তৈরি করা হয় যা একটি মিউটেবল ভ্যারিয়েবল ধারণ করে। এটি STM এর আওতায় থাকে, তাই একাধিক থ্রেড একই ডেটা পরিবর্তন করতে পারবে।dosync
একটি ট্রানজ্যাকশন ব্লক তৈরি করে, যাতে সব পরিবর্তনগুলো একত্রে করা হয়।alter
ফাংশনটি ref
এর মান পরিবর্তন করতে ব্যবহৃত হয় এবং এটি ট্রানজ্যাকশনাল প্রসেসে চলতে থাকে, যাতে নিরাপত্তা বজায় থাকে।ধরা যাক, আমরা একটি ব্যাংক অ্যাকাউন্টে টাকা জমা এবং তোলা করতে চাই, যেখানে একাধিক থ্রেড একই সময়ে কাজ করছে। STM এর মাধ্যমে আমরা এটা সুরক্ষিতভাবে করতে পারব।
(def account-balance (ref 1000))
(defn deposit [amount]
(dosync
(alter account-balance + amount)))
(defn withdraw [amount]
(dosync
(alter account-balance - amount)))
; দুটি থ্রেড একই সময়ে টাকা জমা এবং তুলবে
(future (deposit 500))
(future (withdraw 200))
@account-balance ; আউটপুট: 1300 (1000 + 500 - 200)
এখানে, একাধিক থ্রেড deposit
এবং withdraw
ফাংশন ব্যবহার করছে। STM ব্যবহারের মাধ্যমে, অ্যাকাউন্টের ব্যালেন্স নিশ্চিতভাবে সঠিক থাকে এবং একাধিক থ্রেড একে অপরকে ওভারল্যাপ বা সংঘর্ষ করতে দেয় না।
Software Transactional Memory (STM) একাধিক থ্রেডের মধ্যে সঠিকভাবে ডেটা পরিচালনা করার একটি শক্তিশালী কৌশল, যেখানে ট্রানজ্যাকশন ব্যবহার করে ডেটার সঙ্গতি এবং স্থিতিশীলতা বজায় রাখা হয়। STM এর প্রধান সুবিধা হলো ডেডলক, রেস কন্ডিশন এবং অন্যান্য কনকারেন্ট প্রোগ্রামিং সমস্যাগুলি এড়ানো। ক্লোজারে ref
, dosync
, এবং alter
ফাংশনগুলো ব্যবহার করে STM কার্যকরভাবে বাস্তবায়িত করা যায়।
Clojure-এ Atom, Ref, এবং Agent হল তিনটি মূল কনসেপ্ট যা ডেটা ম্যানেজমেন্ট এবং কনকারেন্ট প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়। এই তিনটি কনসেপ্ট মূলত মিউটেবল স্টেট (mutable state) এবং কনকারেন্ট প্রোগ্রামিংকে দক্ষভাবে পরিচালনা করতে সাহায্য করে। Clojure-এ ডেটা ইমিউটেবল, কিন্তু এই তিনটি কনসেপ্ট ব্যবহার করে আপনি কনকারেন্ট সিস্টেমে ডেটার নিরাপত্তা নিশ্চিত করতে পারেন।
Atom হল একটি মিউটেবল (mutable) ডেটা কাঠামো যা একমাত্র এক থ্রেডের মাধ্যমে পরির্বতিত হতে পারে, তবে এটি অনেক বেশি সুবিধাজনক যখন আপনি ডেটা সমন্বয় (coordination) করতে চান যেখানে আপনি শুধুমাত্র একটি থ্রেডের মাধ্যমে ডেটার পরিবর্তন করবেন।
Atom-এর মূল বৈশিষ্ট্য হলো এটি নিরাপদভাবে একাধিক থ্রেডে পরিবর্তন করা যায়। এটমের প্রতিটি পরিবর্তন একটি "সোয়াপ" (swap) এর মাধ্যমে ঘটে, এবং আপনি নিশ্চিত থাকেন যে একাধিক থ্রেড একই সময়ে একই অ্যাটম পরিবর্তন করতে পারবে না।
(def my-atom (atom initial-value))
Atom
ব্যবহার(def my-atom (atom 0))
; অ্যাটমের মান পরিবর্তন করা
(swap! my-atom inc) ; আউটপুট: 1
; অ্যাটমের বর্তমান মান পড়া
@my-atom ; আউটপুট: 1
এখানে, swap!
ফাংশনটি অ্যাটমের মান পরিবর্তন করতে ব্যবহৃত হয়। @my-atom
দ্বারা আমরা অ্যাটমের মান পড়তে পারি।
Ref হল এমন একটি ডেটা কাঠামো যা ট্রানজ্যাকশনাল মেমোরি মডেল (STM) ব্যবহার করে। যখন আপনি একাধিক থ্রেডের মধ্যে একসাথে ডেটার পরিবর্তন চান, তখন Ref ব্যবহৃত হয়। এটি একটি মিউটেবল ডেটা রেফারেন্স যা dosync
ব্লক ব্যবহার করে একাধিক থ্রেডের মধ্যে সুরক্ষিতভাবে পরিবর্তন করা যায়।
Ref মূলত সিক্যুয়েন্সের মধ্যে কনসিস্টেন্ট (consistent) স্টেট বজায় রাখতে ব্যবহৃত হয়।
(def my-ref (ref initial-value))
Ref
ব্যবহার(def my-ref (ref 0))
; ট্রানজ্যাকশনাল ব্লকে মান পরিবর্তন করা
(dosync
(alter my-ref inc))
; রেফের মান পড়া
@my-ref ; আউটপুট: 1
এখানে, dosync
একটি ট্রানজ্যাকশনাল ব্লক শুরু করে, যেখানে alter
ফাংশনটি my-ref
এর মান পরিবর্তন করে।
Agent হল এমন একটি কনসেপ্ট যা অ্যাসিঙ্ক্রোনাস ডেটা ম্যানেজমেন্টের জন্য ব্যবহৃত হয়। এটি প্রক্রিয়া করে ডেটাকে পরিবর্তন করার জন্য পৃথক থ্রেড ব্যবহার করে। একটি এজেন্টের মান পরিবর্তন করতে আপনি একটি অ্যাসিঙ্ক্রোনাস ফাংশন ব্যবহার করেন, যা অ্যাজেন্টকে কোড পরিবর্তনের জন্য অ্যাকশন (action) পাঠায়।
এজেন্ট ব্যবহার করার সময়, আপনার কোড থ্রেড ব্লক বা ব্লকিং ছাড়া কার্যকরী হতে পারে, কারণ এটি অ্যাসিঙ্ক্রোনাস পদ্ধতিতে কাজ করে।
(def my-agent (agent initial-value))
Agent
ব্যবহার(def my-agent (agent 0))
; অ্যাসিঙ্ক্রোনাসভাবে মান পরিবর্তন করা
(send my-agent inc)
; অ্যাজেন্টের মান পড়া
@my-agent ; আউটপুট: 1 (যেহেতু এটি অ্যাসিঙ্ক্রোনাস, এক্সিকিউশন শেষে মান পরিবর্তিত হবে)
এখানে, send
ফাংশনটি অ্যাসিঙ্ক্রোনাসভাবে এজেন্টের মান পরিবর্তন করতে ব্যবহৃত হয়।
বৈশিষ্ট্য | Atom | Ref | Agent |
---|---|---|---|
সামঞ্জস্য | একক থ্রেডে সুরক্ষা (atomic) | ট্রানজ্যাকশনাল মেমোরি (STM) | অ্যাসিঙ্ক্রোনাস, থ্রেড ব্লকিং ছাড়া |
ব্যবহার | একক থ্রেডে মান পরিবর্তন | একাধিক থ্রেডে মান পরিবর্তন এবং সুরক্ষা | দীর্ঘস্থায়ী অ্যাসিঙ্ক্রোনাস অপারেশন |
মান পরিবর্তন | swap! , reset! | alter , ref-set | send , send-off |
প্রতিক্রিয়া | দ্রুত, সরাসরি পরিবর্তন | একটি সিঙ্ক্রোনাস ট্রানজ্যাকশন প্রক্রিয়া | আসিঙ্ক্রোনাসভাবে ডেটা পরিবর্তন |
সামাজিক ব্যবহার | ছোট, সহজ পরিবর্তন | বড় ডেটা কাঠামো এবং সিক্যুয়েন্স পরিচালনা | বাইরের প্রক্রিয়া বা পরবর্তী অপারেশনগুলো |
swap!
এবং reset!
ব্যবহার হয়।এই তিনটি কনসেপ্ট Clojure-এ কনকারেন্ট প্রোগ্রামিংয়ের সময় ডেটার নিরাপত্তা এবং কার্যকারিতা নিশ্চিত করতে সাহায্য করে, এবং বিভিন্ন পরিস্থিতিতে আপনার ডেটা ম্যানিপুলেশন প্রয়োজন অনুসারে এগুলো ব্যবহার করা যেতে পারে।
pmap
, future
, এবং promise
এর ব্যবহারক্লোজার (Clojure) একটি ফাংশনাল প্রোগ্রামিং ভাষা যা মাল্টি-থ্রেডিং এবং প্যারালাল প্রোগ্রামিংকে সমর্থন করে। ক্লোজারে parallelism বা প্যারালালিজম (একই সময়ে একাধিক কাজ চালানো) করার জন্য pmap
, future
, এবং promise
এর মতো টুলস ব্যবহার করা হয়। এগুলো মাল্টি-থ্রেডেড কার্যক্রমকে সহজে পরিচালনা করতে সহায়ক, এবং নির্দিষ্ট কাজের কার্যকারিতা এবং প্রোডাক্টিভিটি বাড়াতে সহায়ক।
এগুলো আসলে Concurrency (একাধিক কাজ একে অপরের সাথে সময়ের মধ্যে সম্পন্ন হওয়া) এবং Parallelism (একাধিক কাজ একই সময়ে সম্পন্ন হওয়া) এর মধ্যে পার্থক্যকে মান্য করে।
pmap
(Parallel Map)pmap
হল ক্লোজারে একটি প্যারালাল ম্যাপিং ফাংশন যা প্রতিটি কলব্যাক ফাংশনকে পৃথক থ্রেডে প্রসেস করার মাধ্যমে মাল্টি-থ্রেডেডভাবে কাজ করে। এটি মূলত একটি পারALLEL মেপিং ফাংশন, যা বড় ডেটাসেটের উপর অপারেশন কার্যকরী করতে ব্যবহার করা হয়।
pmap
ব্যবহার(defn slow-function [n]
(Thread/sleep 1000)
(* n n))
; pmap ব্যবহার করে ফাংশনকে প্যারালালভাবে প্রয়োগ করা
(def results (pmap slow-function [1 2 3 4 5]))
(println results) ; আউটপুট: (1 4 9 16 25)
এখানে, slow-function
প্রতি সংখ্যায় ১ সেকেন্ড সময় নেয়, কিন্তু pmap
ব্যবহার করে এটি সকল ইনপুটের উপর একযোগে কাজ করে এবং একাধিক থ্রেডে প্রসেস হয়, তাই এটি দ্রুত শেষ হয়।
pmap
ব্যবহারের সুবিধা হলো এটি একাধিক উপাদানকে একযোগে প্যারালাল প্রসেস করতে পারে, বিশেষত যখন কাজের এক্সপেনসিভ বা সময়সাপেক্ষ।future
(অ্যাসিনক্রোনাস কম্পিউটেশন)future
ফাংশনটি ক্লোজারে একটি অ্যাসিনক্রোনাস কম্পিউটেশন সম্পাদন করার জন্য ব্যবহৃত হয়। এটি একটি কাজকে ব্যাকগ্রাউন্ডে রান করার জন্য একটি পৃথক থ্রেডে সরবরাহ করে, এবং যখন কাজটি শেষ হয় তখন তা একটি ফলাফল প্রদান করে। future
মূলত এ্যাসিনক্রোনাস কাজের জন্য ব্যবহৃত হয়, যেখানে আপনি কাজটি সম্পন্ন হওয়ার পরেই ফলাফল চান, তবে মূল থ্রেড চলতে থাকে।
future
ব্যবহার(defn long-running-task [n]
(Thread/sleep 2000)
(* n n))
(def future-result (future (long-running-task 10)))
(println "Task is running asynchronously...")
(println "Result: " @future-result) ; আউটপুট: 100 (2 সেকেন্ড পর)
future
ফাংশনটি একটি ব্যাকগ্রাউন্ড থ্রেডে কাজটি রান করে এবং আপনি @
ব্যবহার করে ফলাফল পাবেন যখন এটি সম্পন্ন হবে।promise
(ফিউচার রেজাল্টের জন্য অপেক্ষা)promise
হল একটি প্যারালাল প্রোগ্রামিং কনসেপ্ট যা একটি মান রিটার্ন করার জন্য অপেক্ষা করতে ব্যবহৃত হয়। এটি একটি বিশেষ ধরনের ভেরিয়েবল বা স্টোরেজ যা অ্যাসিনক্রোনাস ফাংশন বা থ্রেডের মাধ্যমে মান রিটার্ন করার সময় ব্যবহৃত হয়। একটি promise
হল একটি প্লেসহোল্ডার যা অন্য থ্রেড বা প্রসেসের মাধ্যমে মানের উপলব্ধির জন্য অপেক্ষা করে।
promise
ব্যবহার(defn long-task [n p]
(Thread/sleep 3000)
(deliver p (* n n))) ; `deliver` promise পূর্ণ করে
(def my-promise (promise))
; promise এর জন্য অপেক্ষা করা
(future (long-task 10 my-promise))
(println "Waiting for result...")
(println "Result: " @my-promise) ; আউটপুট: 100 (3 সেকেন্ড পর)
long-task
একটি অ্যাসিনক্রোনাস ফাংশন যা promise
এ একটি মান প্রদান করে। মূল থ্রেড @my-promise
ব্যবহার করে সেই মানের জন্য অপেক্ষা করে এবং এটি পাওয়ার পর ফলাফল প্রিন্ট করে।promise
থ্রেডগুলির মধ্যে ডেটা পাস করার জন্য এবং অ্যাসিনক্রোনাস ফাংশনের সাথে সিঙ্ক্রোনাইজ করার জন্য ব্যবহৃত হয়।pmap
, future
, এবং promise
এর তুলনাফাংশন | উদ্দেশ্য | ব্যবহার |
---|---|---|
pmap | মাল্টিপল উপাদানের উপর প্যারালাল অপারেশন (যেমন map ফাংশনের মতো) | একটি কলব্যাক ফাংশন একাধিক থ্রেডে চালানোর জন্য |
future | অ্যাসিনক্রোনাস কাজ চালানো এবং ফলাফল পরে পাওয়া | ব্যাকগ্রাউন্ড থ্রেডে দীর্ঘ চলমান কাজ সম্পন্ন করার জন্য |
promise | অ্যাসিনক্রোনাস মানের জন্য প্লেসহোল্ডার, যা রেজাল্ট পাওয়ার জন্য অপেক্ষা করে | এক থ্রেডে মান প্রদান এবং অন্য থ্রেডে সেই মানের জন্য অপেক্ষা করা |
এই তিনটি ফাংশনই ক্লোজারে প্যারালাল প্রোগ্রামিং এবং অ্যাসিনক্রোনাস কার্যক্রমকে সহজে পরিচালনা করার জন্য ব্যবহৃত হয়। pmap
প্যারালাল প্রসেসিংয়ের জন্য, future
অ্যাসিনক্রোনাস কম্পিউটেশনের জন্য এবং promise
ফিউচার রেজাল্টের জন্য অপেক্ষা করার জন্য উপকারী।
common.read_more