মধ্যে পার্থক্য কি Future
এবং Promise
?
তারা উভয়ই ভবিষ্যতের ফলাফলের জন্য স্থানধারীর মতো কাজ করে তবে মূল পার্থক্যটি কোথায়?
মধ্যে পার্থক্য কি Future
এবং Promise
?
তারা উভয়ই ভবিষ্যতের ফলাফলের জন্য স্থানধারীর মতো কাজ করে তবে মূল পার্থক্যটি কোথায়?
উত্তর:
এই আলোচনা অনুসারে , Promise
শেষ পর্যন্ত CompletableFuture
জাভা 8-তে অন্তর্ভুক্তির জন্য আহ্বান জানানো হয়েছিল এবং এর জাভাদোক ব্যাখ্যা করেছেন:
এমন একটি ভবিষ্যত যা স্পষ্টভাবে সম্পন্ন হতে পারে (এর মান এবং স্থিতি নির্ধারণ করে), এবং এটি কমপ্লিটসটেজ হিসাবে ব্যবহৃত হতে পারে, নির্ভরশীল ফাংশন এবং ক্রিয়াকে সমর্থন করে যা এর সমাপ্তির পরে ট্রিগার করে।
তালিকায় একটি উদাহরণও দেওয়া হয়েছে:
f.then((s -> aStringFunction(s)).thenAsync(s -> ...);
নোট করুন যে চূড়ান্ত এপিআই কিছুটা আলাদা তবে একই রকম অ্যাসিনক্রোনাস এক্সিকিউশনকে অনুমতি দেয়:
CompletableFuture<String> f = ...;
f.thenApply(this::modifyString).thenAccept(System.out::println);
(আমি এখনও পর্যন্ত উত্তরগুলি নিয়ে পুরোপুরি খুশি নই, তাই আমার চেষ্টা এখানে ...)
আমি মনে করি কেভিন রাইটের মন্তব্য ( "আপনি একটি প্রতিশ্রুতি দিতে পারেন এবং এটি রাখা আপনার উপর নির্ভর করে When অন্য কেউ যখন আপনাকে কোন প্রতিশ্রুতি দেয় তখন আপনাকে অবশ্যই ভবিষ্যতে এটি সম্মানিত কিনা তা দেখার অপেক্ষা করতে হবে" ) এটি সংক্ষিপ্ত বিবরণ দিয়েছে, তবে কিছু ব্যাখ্যা দরকারী হতে পারে।
ফিউচার এবং প্রতিশ্রুতিগুলি বেশ অনুরূপ ধারণা, পার্থক্যটি হ'ল ভবিষ্যত এমন একটি ফলাফলের জন্য কেবল পঠনযোগ্য ধারক যা এখনও বিদ্যমান নেই, যখন একটি প্রতিশ্রুতি লেখা যেতে পারে (সাধারণত কেবল একবারেই)। জাভা 8 কমপ্লেটেবলফিউচার এবং পেয়ারা সেটেটেফিউচারকে প্রতিশ্রুতি হিসাবে ভাবা যেতে পারে, কারণ তাদের মান সেট করা যেতে পারে ("সমাপ্ত"), তবে তারা ফিউচার ইন্টারফেসও প্রয়োগ করে, তাই ক্লায়েন্টের জন্য কোনও পার্থক্য নেই।
ভবিষ্যতের ফলাফল "অন্য কেউ" দ্বারা সেট করা হবে - একটি অ্যাসিনক্রোনাস গণনার ফলাফল দ্বারা। ফিউচারটাস্ক - কীভাবে একটি ক্লাসিক ভবিষ্যত - অবশ্যই কলযোগ্য বা চলমানযোগ্য দিয়ে শুরু করতে হবে, কোনও যুক্তি-নির্ধারক নেই, এবং ভবিষ্যত এবং ফিউচারটাসক উভয়ই কেবল বাইরে থেকে পঠনযোগ্য (ফিউচারটাসকের সেট পদ্ধতিগুলি সুরক্ষিত)। মানটি ভিতর থেকে গণনার ফলাফলকে সেট করা হবে।
অন্যদিকে, প্রতিশ্রুতির ফলাফলটি "আপনি" (বা বাস্তবে যে কেউ দ্বারা) যে কোনও সময় সেট করা যেতে পারে কারণ এর পাবলিক সেটার পদ্ধতি রয়েছে। কমপ্লিটেবল ফিউচার এবং সেটেটেফিউশন উভয়ই কোনও কাজ ছাড়াই তৈরি করা যায় এবং যে কোনও সময় তাদের মান নির্ধারণ করা যায়। আপনি ক্লায়েন্ট কোডে একটি প্রতিশ্রুতি প্রেরণ করুন, এবং আপনার ইচ্ছামতো পরে তা পূরণ করুন।
নোট করুন যে কমপ্লেটেবলফিউচার কোনও "খাঁটি" প্রতিশ্রুতি নয়, এটি ফিউচারটাসকের মতো কোনও কাজ দিয়ে শুরু করা যেতে পারে এবং এর সর্বাধিক দরকারী বৈশিষ্ট্যটি প্রক্রিয়াজাতকরণের পদক্ষেপগুলিকে সম্পর্কিত নয়।
আরও মনে রাখবেন যে কোনও প্রতিশ্রুতি ভবিষ্যতের উপ-টাইপ হতে হবে না এবং এটি একই জিনিস হতে হবে না। স্কালায় একটি ফিউচার অবজেক্ট একটি অ্যাসিনক্রোনাস গণনা বা একটি পৃথক প্রতিশ্রুতি বস্তু দ্বারা তৈরি করা হয় । সি ++ তে পরিস্থিতি একই রকম: প্রতিশ্রুতি বস্তুটি নির্মাতা এবং ভবিষ্যতের বস্তু গ্রাহক দ্বারা ব্যবহৃত হয় used এই বিচ্ছেদের সুবিধাটি হ'ল ক্লায়েন্ট ভবিষ্যতের মান নির্ধারণ করতে পারে না।
স্প্রিং এবং ইজেবি ৩.১ উভয়েরই একটি এসিঙ্কআরসাল্ট ক্লাস রয়েছে, যা স্কালা / সি ++ প্রতিশ্রুতির অনুরূপ। অ্যাসিঙ্করসাল্ট ফিউচার বাস্তবায়ন করে তবে এটি আসল ভবিষ্যত নয়: স্প্রিং / ইজেবিতে অ্যাসিঙ্ক্রোনাস পদ্ধতিগুলি কিছু ব্যাকগ্রাউন্ড ম্যাজিকের মাধ্যমে আলাদা, কেবল পঠনযোগ্য ফিউচার অবজেক্ট ফিরিয়ে দেয় এবং ফলাফলটি অ্যাক্সেসের জন্য ক্লায়েন্টের দ্বারা এই দ্বিতীয় "আসল" ভবিষ্যত ব্যবহার করা যেতে পারে।
আমি সচেতন যে ইতিমধ্যে একটি গ্রহণযোগ্য উত্তর আছে তবে তবুও আমার দুটি সেন্ট যুক্ত করতে চাই:
টিএলডিআর: ভবিষ্যত এবং প্রতিশ্রুতি একটি অ্যাসিনক্রোনাস অপারেশনের দুটি দিক: গ্রাহক / কলার বনাম প্রযোজক / প্রয়োগকারী ।
একটি অ্যাসিনক্রোনাস এপিআই পদ্ধতির কলার হিসাবে , আপনি Future
গণনার ফলাফলের একটি হ্যান্ডেল হিসাবে পাবেন । আপনি get()
উদাহরণটি সম্পূর্ণ করতে এবং ফলাফলটি পুনরুদ্ধারের জন্য গণনাটির জন্য অপেক্ষা করতে এটি করতে পারেন ।
এখন ভাবুন কীভাবে এই এপিআই পদ্ধতিটি বাস্তবায়িত হয়: বাস্তবায়নকারীকেFuture
অবিলম্বে ফিরে আসতে হবে। গণনাটি শেষ হওয়ার সাথে সাথে তারা ভবিষ্যতটি সম্পূর্ণ করার জন্য দায়বদ্ধ (যা তারা জানতে পারবে কারণ এটি প্রেরণের যুক্তি বাস্তবায়ন করছে ;-))। তারা কেবল এটি করতে একটি Promise
/ ব্যবহার করবে CompletableFuture
: CompletableFuture
অবিলম্বে তৈরি করুন এবং ফিরিয়ে দিন এবং complete(T result)
গণনা শেষ হয়ে গেলে কল করুন ।
ভবিষ্যতের বিপরীতে কোনটি প্রতিশ্রুতিবদ্ধ এবং এর মান কীভাবে নির্ধারণ করা যেতে পারে তার একটি উদাহরণ দেব, যার মানটি কেবল পঠনযোগ্য।
মনে করুন আপনার একটি মা আছে এবং আপনি তার কাছে টাকা চান।
// Now , you trick your mom into creating you a promise of eventual
// donation, she gives you that promise object, but she is not really
// in rush to fulfill it yet:
Supplier<Integer> momsPurse = ()-> {
try {
Thread.sleep(1000);//mom is busy
} catch (InterruptedException e) {
;
}
return 100;
};
ExecutorService ex = Executors.newFixedThreadPool(10);
CompletableFuture<Integer> promise =
CompletableFuture.supplyAsync(momsPurse, ex);
// You are happy, you run to thank you your mom:
promise.thenAccept(u->System.out.println("Thank you mom for $" + u ));
// But your father interferes and generally aborts mom's plans and
// completes the promise (sets its value!) with far lesser contribution,
// as fathers do, very resolutely, while mom is slowly opening her purse
// (remember the Thread.sleep(...)) :
promise.complete(10);
এর ফলাফল:
Thank you mom for $10
মায়ের প্রতিশ্রুতি তৈরি হয়েছিল, তবে কিছু "সমাপ্তি" ইভেন্টের জন্য অপেক্ষা করেছিল।
CompletableFuture<Integer> promise...
আপনি তার প্রতিশ্রুতি গ্রহণ করে এবং আপনার মাকে ধন্যবাদ দেওয়ার জন্য আপনার পরিকল্পনা ঘোষণা করে এই জাতীয় ইভেন্ট তৈরি করেছেন:
promise.thenAccept...
এই মুহুর্তে মা তার পার্স খুলতে শুরু করল ... তবে খুব ধীর ...
এবং বাবা আরও দ্রুত হস্তক্ষেপ করেছিলেন এবং আপনার মায়ের পরিবর্তে প্রতিশ্রুতিটি শেষ করেছেন:
promise.complete(10);
আপনি কি কোনও নির্বাহককে লক্ষ্য করেছেন যা আমি স্পষ্টভাবে লিখেছি?
মজার বিষয় হল, আপনি যদি এর পরিবর্তে কোনও ডিফল্ট অন্তর্নিহিত নির্বাহক (কমনপুল) ব্যবহার করেন এবং বাবা বাড়িতে না থাকেন তবে কেবল তার "স্লো পার্স" দিয়ে মা থাকেন, তবে তার প্রতিশ্রুতি কেবল তখনই পূর্ণ হবে, যদি মায়ের কাছ থেকে অর্থ প্রাপ্তির প্রয়োজনের চেয়ে প্রোগ্রাম দীর্ঘায়িত হয় পার্স।
ডিফল্ট নির্বাহক "ডেমন" এর মতো ধরণের কাজ করে এবং সমস্ত প্রতিশ্রুতি পূর্ণ হওয়ার জন্য অপেক্ষা করে না। আমি এই সত্যটির একটি ভাল বিবরণ পাইনি ...
এটির উত্তর হতে পারে কিনা তা নিশ্চিত নন তবে আমি যেমন দেখছি অন্যরা কারও জন্য যা বলেছে তা দেখে মনে হতে পারে আপনার এই দুটি ধারণার জন্য দুটি পৃথক বিমূর্ততা প্রয়োজন যাতে তাদের (একটি Future
) অন্যটির কেবল পঠনযোগ্য দৃষ্টিভঙ্গি ( Promise
) ... তবে আসলে এটির দরকার নেই।
উদাহরণস্বরূপ জাভাস্ক্রিপ্টে প্রতিশ্রুতিগুলি কীভাবে সংজ্ঞায়িত করা হয় তা একবার দেখুন:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
ফোকাসটি এই পদ্ধতিটি ব্যবহার করে সামঞ্জস্যযোগ্যতার দিকে রয়েছে then
:
asyncOp1()
.then(function(op1Result){
// do something
return asyncOp2();
})
.then(function(op2Result){
// do something more
return asyncOp3();
})
.then(function(op3Result){
// do something even more
return syncOp4(op3Result);
})
...
.then(function(result){
console.log(result);
})
.catch(function(error){
console.log(error);
})
যা সিঙ্ক্রোনাসের মতো দেখতে অ্যাসিঙ্ক্রোনাস গণনা করে:
try {
op1Result = syncOp1();
// do something
op1Result = syncOp2();
// do something more
op3Result = syncOp3();
// do something even more
syncOp4(op3Result);
...
console.log(result);
} catch(error) {
console.log(error);
}
যা বেশ সুন্দর। ( অ্যাসিঙ্ক-প্রতীক্ষার মতো শীতল নয় তবে অ্যাসিঙ্ক-ওয়েভেট কেবল বয়লারপ্লেট সরিয়ে দেয় .... তারপরে (ফাংশন (ফলাফল) {.... এটি থেকে))।
এবং প্রকৃতপক্ষে তাদের বিমূর্ততা প্রতিশ্রুতিবদ্ধ নির্মাণকারী হিসাবে বেশ ভাল
new Promise( function(resolve, reject) { /* do it */ } );
আপনাকে দুটি কলব্যাক সরবরাহ করতে দেয় যা Promise
সফলভাবে বা ত্রুটিযুক্তভাবে সম্পূর্ণ করতে ব্যবহৃত হতে পারে । যাতে কেবলমাত্র Promise
কোডগুলি তৈরি করে এটি সম্পূর্ণ করতে পারে এবং ইতিমধ্যে নির্মিত Promise
বস্তুটি প্রাপ্ত কোডটিতে কেবল পঠনযোগ্য দর্শন থাকে।
উত্তরাধিকারের সাথে উপরোক্ত অধিকারগুলি অর্জন করা যেতে পারে যদি সমাধান এবং প্রত্যাখ্যানগুলি সুরক্ষিত পদ্ধতি হয়।
CompletableFuture
এর সাথে কিছু মিল থাকতে পারে Promise
তবে এটি এখনও একটি নয়Promise
, কারণ এটি গ্রাস করার ইচ্ছাটি ভিন্ন: একটি Promise
ফলাফল ফলাফল কল করে গ্রহণ করা হয় then(function)
, এবং প্রযোজক কল করার সাথে সাথেই ফাংশনটি নির্মাতার প্রসঙ্গে কার্যকর করা হয়resolve
। একজন Future
'র ফলাফলের কলিং দ্বারা ক্ষয়প্রাপ্ত হয় get
যা পর্যন্ত প্রযোজক থ্রেড মান সৃষ্টি করেছে অপেক্ষা করতে ভোক্তা থ্রেড ঘটায় তারপর ভোক্তা এটা প্রক্রিয়া করে। Future
সহজাতভাবে
Promise
কেবলমাত্র একটি একক থ্রেডের সাথে এটি ব্যবহার করা সম্পূর্ণভাবে সম্ভব (এবং বাস্তবে এগুলি যথাযথ পরিবেশের জন্য যা তারা মূলতঃ ডিজাইন করা হয়েছিল: জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনগুলিতে সাধারণত শুধুমাত্র একটি থ্রেড থাকে, সুতরাং আপনি সেখানে প্রয়োগ করতে পারবেন নাFuture
)। Promise
অতএব তুলনায় অনেক বেশি হালকা ও দক্ষ Future
, তবে Future
যে পরিস্থিতি আরও জটিল এবং থ্রেডগুলির মধ্যে সহজে সহযোগিতা প্রয়োজন যা Promise
এস ব্যবহার করে সহজে সাজানো যায় না এমন ক্ষেত্রে সহায়ক হতে পারে । সংক্ষিপ্তসার হিসাবে: Promise
এটি একটি পুশ মডেল, যখন Future
একটি পুল মডেল (সিএফ Iteable বনাম পর্যবেক্ষণযোগ্য)
XMLHttpRequest
)। আমি দক্ষতার দাবিতে বিশ্বাস করি না, আপনার কি কিছু পরিসংখ্যান রয়েছে? +++ এটি বলেছেন, খুব সুন্দর ব্যাখ্যা।
get
অমীমাংসিত কল Future
করাতে অগত্যা ২ টি থ্রেড কনটেক্সট স্যুইচ অন্তর্ভুক্ত থাকবে, যা কমপক্ষে কয়েক বছর আগে আমাদের প্রায় ৫০ টির প্রয়োজন ছিল ।
ক্লায়েন্ট কোডের জন্য, প্রতিশ্রুতি হ'ল ফল পাওয়া গেলে কলব্যাক পর্যবেক্ষণ বা সংযুক্ত করার জন্য, যেখানে ভবিষ্যতের ফলাফলের জন্য অপেক্ষা করা এবং তারপরে চালিয়ে যাওয়া continue তাত্ত্বিকভাবে প্রতিশ্রুতি দিয়ে কি করা সম্ভব ফিউচারগুলির সাথে যা করা সম্ভব তা কিন্তু স্টাইলের পার্থক্যের কারণে বিভিন্ন ভাষায় প্রতিশ্রুতির ফলস্বরূপ এপিআই চেইন সহজ করে তোলে।
ফিউচার ইন্টারফেসে কোনও সেট পদ্ধতি নেই, কেবল পদ্ধতিটি পান, তাই এটি কেবল পঠনযোগ্য। কমপ্লেটেবলফিউচার সম্পর্কে, এই নিবন্ধটি সম্ভবত সহায়ক। completablefuture
Promise
এবং এটি রাখা আপনার উপর নির্ভর করে। যখন অন্য কেউ আপনাকে প্রতিশ্রুতি দেয় আপনি অবশ্যই তাদের অপেক্ষা করতে হবে অপেক্ষা করতে হবেFuture