রেফ, ভার, এজেন্ট, পরমাণুর মধ্যে ক্লোজার পার্থক্য উদাহরণ সহ


110

আমি ক্লোজুরে খুব নতুন, আপনি কি আমাকে বাস্তব বিশ্বের পরিস্থিতি দিয়ে আমাকে ব্যাখ্যা দিতে পারেন। মানে, রেফ, ভার, এজেন্ট, পরমাণু কোথায় ব্যবহার করবেন। আমি বইটি পড়েছি, তবে এখনও বাস্তব বিশ্বের উদাহরণগুলি বুঝতে পারি নি।

উত্তর:


174

এই প্রশ্নের সত্যিকারের উত্তরের জন্য আমি "দ্য জয় অফ ক্লজিউর" বা "প্রোগ্রামিং ক্লোজার" কে অত্যন্ত পরামর্শ দিচ্ছি, আমি প্রত্যেকটির অনুপ্রেরণার একটি সংক্ষিপ্ত স্নিপ পুনরুত্পাদন করতে পারি:

পরিচয় এবং / অথবা এখানে পড়াশোনার ধারণাটি নিয়ে এই ভিডিওটি দেখে শুরু করুন

  • রেফগুলি হ'ল "অনেক পরিচয়" তে সমন্বিত সিঙ্ক্রোনাস অ্যাক্সেসের জন্য।
  • পরমাণুগুলি একটি একক সনাক্তকরণে আনকর্ডিনেটেড সিঙ্ক্রোনাস অ্যাক্সেসের জন্য।
  • এজেন্টগুলি একক পরিচয় অ- সমন্বিত অ্যাসিনক্রোনাস অ্যাক্সেসের জন্য।
  • বারগুলি একটি ভাগ করা ডিফল্ট মান সহ স্থানীয় বিচ্ছিন্ন পরিচয়ের জন্য ।

সমন্বিত অ্যাক্সেস ব্যবহার করা হয় যখন দুটি পরিচয় এক সাথে পরিবর্তিত হওয়া দরকার, ক্লাসিক উদাহরণটি এক ব্যাংক অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে অর্থ সঞ্চার করছে, এটি হয় পুরোপুরি সরানো দরকার বা একেবারেই নয়।

কেবলমাত্র একটি পরিচয় আপডেট করার প্রয়োজন হলে অসংযুক্ত অ্যাক্সেস ব্যবহার করা হয়, এটি খুব সাধারণ ঘটনা।

সিঙ্ক্রোনাস অ্যাক্সেস ব্যবহৃত হয় যখন কলটি চালিয়ে যাওয়ার আগে সমস্ত পরিচয় নিষ্পত্তি না হওয়া অবধি অপেক্ষা করতে থাকে।

অ্যাসিঙ্ক্রোনাস অ্যাক্সেস হ'ল "আগুন এবং ভুলে যাও" এবং পরিচয়টি তার নিজস্ব সময়ে নতুন অবস্থায় পৌঁছে দেয়।


সমন্বিত অ্যাক্সেসে, আমি যদি কেবল পরিবর্তন করতে চাই, তবে তা করার বিষয়ে state-aউল্লেখ state-bকরি তবে আমার এখনও একটি refসঠিক প্রয়োজন ? সুতরাং এটি একাধিক জিনিস পরিবর্তন না করে একাধিক জিনিস উল্লেখ করে যখন কোনও পরিবর্তন করার সময়?
ইভেন্ট_জর

2
হ্যাঁ, আপনি সঠিকভাবে বুঝতে পেরেছেন বলে মনে করেন যে রাষ্ট্র-ক এবং রাজ্য-বি উভয়ই রেফ হওয়া উচিত যদি আপনি চান যে রাজ্য-এ-তে নতুন মান একটি এবং বি এর মানগুলির ধারাবাহিক সংমিশ্রণের ভিত্তিতে করা হোক। আপনার সেই নতুন মানটি এমন প্রসঙ্গে গণনা করা দরকার যেখানে স্টেট-এ এবং রাজ্য-বি যেখানে প্রতিটিের সাথে সামঞ্জস্য রয়েছে। যখন তারা উভয়ই রেফ হয়, যদি বি মাঝখানে দিয়ে পরিবর্তন হয়, তবে লেনদেনটি পুনরায় আরম্ভ হবে এবং a এবং b উভয়ের নতুন মান ব্যবহার করবে। এই স্পষ্ট এবং আরও কার্যকর করতে Clojure.github.io/clojure/clojure.core-api.html#clojure.core/…ensure ফাংশনটি ব্যবহার করার বিষয়ে বিবেচনা করুন ।
আর্থার উলফেল্ট 18

3
ভাগ করে নেওয়া ডিফল্ট অর্থের সাথে কী বিচ্ছিন্ন হয়েছে তার একটি ব্যাখ্যা উত্তর সম্পূর্ণ করতে যোগ করা যেতে পারে?
দিদিয়ের এ।

1
"দুটি পরিচয় এক সাথে পরিবর্তন করার দরকার হলে সমন্বিত অ্যাক্সেস ব্যবহৃত হয় ..."। "পরিবর্তন" করা উচিত?
কারসিজিনিট

40

রেফসগুলি সেই রাষ্ট্রের জন্য যা থ্রেডগুলির মধ্যে সিঙ্ক্রোনাইজ করা দরকার। আপনার যদি বিভিন্ন জিনিসের একগুচ্ছ নজর রাখার প্রয়োজন হয় এবং আপনার মাঝে মাঝে অপারেশনগুলি করতে হবে যা একবারে বেশ কয়েকটি জিনিসকে লেখেন, রেফ ব্যবহার করুন। যে কোনও সময় আপনার একাধিক পৃথক রাষ্ট্রের টুকরা থাকে, রেফ ব্যবহার করা কোনও খারাপ ধারণা নয়।

পরমাণুগুলি স্বাধীন রাষ্ট্রের জন্য যা থ্রেডগুলির মধ্যে সিঙ্ক্রোনাইজ করা দরকার। আপনার যদি কখনই অ্যাটমের অবস্থা এবং একই সাথে অন্য কোনও কিছু পরিবর্তন করার প্রয়োজন হয় না, পরমাণু ব্যবহার করা নিরাপদ (বিশেষত, পুরো প্রোগ্রামে যদি শুধুমাত্র এক টুকরো রাষ্ট্র থাকে তবে আপনি এটি পরমাণুতে রাখতে পারেন) । একটি তুচ্ছ উদাহরণ হিসাবে, আপনি যদি কোনও ফাংশনের রিটার্ন মানগুলি (যেমন এটি স্মরণ করিয়ে দেওয়ার) ক্যাশে করার চেষ্টা করছেন তবে একটি পরমাণু ব্যবহার করা সম্ভবত নিরাপদ - ফাংশনটির বাইরের সমস্ত কিছুতে রাষ্ট্র অদৃশ্য, সুতরাং আপনাকে চিন্তার দরকার নেই ফাংশনটির অভ্যন্তরে কোনও রাজ্য পরিবর্তন সম্পর্কে গোলমাল।

এজেন্টদের প্রাথমিক পয়েন্টটি হ'ল তারা আলাদা থ্রেডে চলে। আপনি এজেন্টের মান পেতে পারেন এবং এটির মানটির সাথে একটি ফাংশন প্রয়োগ করতে বলতে পারেন, তবে ফাংশনটি কখন চলবে বা ফাংশনটি কী মান প্রয়োগ করা হবে তা আপনি জানেন না।

প্রতি-থ্রেড ভিত্তিতে আপনার যখন কিছু সঞ্চয় করতে হয় তখন যুদ্ধগুলি হয়। আপনার যদি একটি মাল্টি-থ্রেডেড প্রোগ্রাম থাকে এবং প্রতিটি থ্রেডের নিজস্ব ব্যক্তিগত রাষ্ট্রের প্রয়োজন হয় তবে সেই রাজ্যটিকে একটি ভারে রাখুন।

রিয়েল-ওয়ার্ল্ডের উদাহরণগুলি যতদূর যায়, আপনি যা করার চেষ্টা করছেন তার একটি উদাহরণ যদি আপনি সরবরাহ করেন তবে আমরা আপনাকে কী ব্যবহার করতে হবে তা বলতে পারি।


32

আমি প্রথম যখন এই প্রকারগুলি সম্পর্কে পড়ি, তখন আমি বুঝতে চেষ্টা করেছিলাম যে আমি কোথায় প্রতিটি ব্যবহার করতে পারি বা ব্যবহার করতে পারি তাই আমার স্পষ্ট ইংরেজি উত্তরটি এখানে:

ডেটা পরিবর্তন হবে না যখন একটি var ব্যবহার করুন। এই ঘটনা যখনই আপনি ব্যবহার defঅথবা সবচেয়ে ফাংশন যে দিয়ে শুরু defমত defn

আপনার যখন কোনও একক আইটেম পরিবর্তিত হয় তখন একটি পরমাণু ব্যবহার করুন। একটি উদাহরণ কোনও কাউন্টার বা ভেক্টর হতে পারে যা আপনি আইটেমগুলিতে যুক্ত করতে চান।

আপনার যখন দুটি বা ততোধিক জিনিস থাকে তখন একই সময়ে পরিবর্তন করতে হবে a আপনি যদি পরিচিত হন তবে "ডাটাবেস লেনদেন" ভাবেন। এর আধ্যাত্মিক উদাহরণটি এক অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে অর্থ স্থানান্তর করা। প্রতিটি অ্যাকাউন্ট একটি রেফারেন্সে সংরক্ষণ করা যেতে পারে যাতে পারমাণবিক প্রদর্শিত হতে পারে।

আপনি যখন কিছু পরিবর্তন করতে চান তখন কোনও এজেন্ট ব্যবহার করুন তবে কখন সে যত্ন করবেন না। এটি একটি দীর্ঘ গণনা বা ফাইল বা সকেটে কিছু লেখা হতে পারে। নোট করুন যে পরবর্তীগুলির সাথে আপনার ব্যবহার করা উচিত send-off

দ্রষ্টব্য: আমি প্রশংসা করি যে এগুলির প্রতিটির জন্য আরও অনেক কিছু রয়েছে তবে আশা করি এটি আপনাকে একটি সূচনা পয়েন্ট দেবে।


1
আপনার সুস্পষ্ট প্রতিক্রিয়ার জন্য অনেক ধন্যবাদ :-) আমার মতো ক্লোজার নবাগতকে অনেকটা সহায়তা করে।
gosukiwi

27

আমি তাদের মধ্যে পার্থক্য সংক্ষিপ্তসার সহ নিবন্ধ লিখেছিলাম এবং কোনটি কখন ব্যবহার করবেন তা চয়ন করতে সহায়তা করে।

রাজ্য ভাগ করুন - কখন যুদ্ধ, পরমাণু, এজেন্ট এবং রেফ ব্যবহার করবেন?

আমি আশা করি এটি এই বিষয়ে লোকদের উত্তর খুঁজতে সহায়তা করবে।

@ ফুনাছির পরামর্শের পরে নিবন্ধ থেকে কিছু শর্টকাট:

Vars,

বারগুলি প্রতিটি থ্রেডের জন্য বৈশ্বিক।

তৈরির পরে ভার্স পরিবর্তন করবেন না। এটি প্রযুক্তিগতভাবে সম্ভব, তবে এটি বহু কারণে খারাপ ধারণা।

অ্যাটমস

প্রতিটি থ্রেডের জন্য পরিবর্তনীয় স্থানে অ্যাক্সেস ভাগ করুন। পরিবর্তন সিঙ্ক্রোনালি ঘটে। যখন অন্য থ্রেড চলাকালীন রাষ্ট্র পরিবর্তন করে তবে আবার চেষ্টা করুন।

দীর্ঘ সময় কার্যকরকরণের সাথে আদর্শহীন ফাংশন এবং ফাংশন ব্যবহার করবেন না

এজেন্ট

প্রতিটি থ্রেডের জন্য পরিবর্তনীয় স্থানে অ্যাক্সেস ভাগ করুন। অ্যাসিঙ্ক্রোনালি পরিবর্তন হয়।

refs

রেফস ডাটাবেস লেনদেনের মতো কাজ করে। লিখুন এবং পড়ুন dosync সুরক্ষিত। আপনি লেনদেনে নিরাপদে অনেকগুলি রেফের উপর পরিচালনা করতে পারেন।

এবং ফ্লোচার্ট যখন ব্যবহার করুন: ফ্লোচার্ট

ওয়েবসাইটটিতে চিত্রটি দেখুন, কারণ কিছু আপডেট সর্বদা সম্ভব।

অনুলিপি এবং অতীত নিবন্ধ ছাড়াই পুরো উত্তর দেওয়া জটিল এবং দীর্ঘ বিষয়, সুতরাং দয়া করে আমাকে ক্ষমা করুন আমি আপনাকে ওয়েবসাইটে পুনঃনির্দেশ করি :)


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.