প্রোগ্রামিং ভাষাগুলি কেন স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাস / অ্যাসিনক্রোনাস সমস্যা পরিচালনা করে না?


27

আমি এ সম্পর্কে অনেক সংস্থান খুঁজে পাইনি: আমি ভাবছিলাম যে এটি সম্ভবত / একটি ভাল ধারণা একটি সিঙ্ক্রোনাস উপায়ে অ্যাসিঙ্ক্রোনাস কোড লিখতে সক্ষম হবে কিনা।

উদাহরণস্বরূপ, এখানে কিছু জাভাস্ক্রিপ্ট কোড রয়েছে যা একটি ডাটাবেসে সঞ্চিত ব্যবহারকারীর সংখ্যা পুনরুদ্ধার করে (একটি অ্যাসিনক্রোনাস অপারেশন):

getNbOfUsers(function (nbOfUsers) { console.log(nbOfUsers) });

এরকম কিছু লিখতে পেরে ভাল লাগবে:

const nbOfUsers = getNbOfUsers();
console.log(getNbOfUsers);

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

ত্রুটিগুলি এখনও চেষ্টাযোগ্য nbOfUsers/ ধরা ব্যবহার করে বা সুইফট ভাষার মতো বিকল্পের মতো কিছু ব্যবহার করে ( কোনও পূর্ণসংখ্যা বা ত্রুটি পেয়েছিল ?) ব্যবহারযোগ্য হবে ।

এটা কি সম্ভব? এটি একটি ভয়ানক ধারণা / ইউটোপিয়া হতে পারে ... আমি জানি না।


58
আমি সত্যিই আপনার প্রশ্ন বুঝতে পারি না। যদি আপনি "সর্বদা অ্যাসিনক্রোনাস অপারেশনের জন্য অপেক্ষা করেন", তবে এটি কোনও অ্যাসিঙ্ক্রোনাস অপারেশন নয়, এটি একটি সিঙ্ক্রোনাস অপারেশন। আপনি কি স্পষ্ট করতে পারেন? আপনি যে ধরণের আচরণের সন্ধান করছেন তার একটি বিবরণ দিতে পারেন? এছাড়াও, "আপনি এটি সম্পর্কে কী ভাবেন" সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের অফ-টপিক । আপনার নিজের প্রশ্নটি একটি কংক্রিট সমস্যার প্রসঙ্গে তৈরি করতে হবে, যার একক, দ্ব্যর্থহীন, বিহ্বল, উদ্দেশ্যমূলক সঠিক উত্তর রয়েছে has
জার্গ ডব্লু মিটাগ

4
@ JörgWMittag আমি একটি প্রকল্পিত C # এর কল্পনা পরোক্ষভাবে awaitSA Task<T>তা রূপান্তর করতেT
Caleth

6
আপনি যা প্রস্তাব দেন তা করণীয় নয়। আপনি ফলাফলটির অপেক্ষায় থাকতে চান বা সম্ভবত আগুনে ভুলে যেতে চান তা নির্ধারণ করার সিদ্ধান্ত নেই। বা পটভূমিতে চালানো এবং পরে অপেক্ষা করুন। নিজেকে কেন এমনভাবে সীমাবদ্ধ কর?
freakish

5
হ্যাঁ, এটি একটি ভয়ানক ধারণা। কেবল ব্যবহার async/ awaitপরিবর্তে, যা মৃত্যুদন্ডের অ্যাসিঙ্ক অংশগুলি সুস্পষ্ট করে তোলে।
বার্গি

5
আপনি যখন বলেন যে দুটি জিনিস একই সাথে ঘটে থাকে তখন আপনি বলছেন যে এই জিনিসগুলি যে কোনও ক্রমে ঘটে। আপনার কোডটিতে কোন পুনঃ-অর্ডারিংগুলি আপনার কোডের প্রত্যাশাগুলি ভঙ্গ করবে না তা পরিষ্কার করার কোনও উপায় না থাকলে তা তাদের একসাথে করতে পারে না।
রব

উত্তর:


65

দুটি অতিরিক্ত কীওয়ার্ড সত্ত্বেও অ্যাসিঙ্ক / প্রতীক্ষা হ'ল আপনার প্রস্তাবিত হ'ল স্বয়ংক্রিয় পরিচালন। কেন তারা গুরুত্বপূর্ণ? পিছনে সামঞ্জস্যতা বাদে?

  • সুস্পষ্ট বিন্দু ছাড়াই যেখানে কোনও কর্টিন স্থগিত ও পুনরায় চালু হতে পারে, সেখানে অপেক্ষা করার জন্য আমাদের একটি প্রকারের ব্যবস্থা প্রয়োজন awa অনেক প্রোগ্রামিং ভাষায় এ জাতীয় টাইপ সিস্টেম থাকে না।

  • সুস্পষ্ট মানটির অপেক্ষায় আমরা প্রথম শ্রেণীর অবজেক্ট: প্রতিশ্রুতি হিসাবে প্রত্যাশিত মানগুলিও পার করতে পারি। উচ্চতর-অর্ডার কোড লেখার সময় এটি বেশ কার্যকর হতে পারে।

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

    এবং এটি অত্যন্ত অনাকাঙ্ক্ষিত কারণ এটির খুব খারাপ পারফরম্যান্সের প্রভাব রয়েছে। আপনি কেবল সস্তা মূল্য ফেরত দিতে সক্ষম হবেন না। প্রতিটি ফাংশন কল অনেক বেশি ব্যয়বহুল হয়ে উঠত।

অ্যাসিঙ্ক দুর্দান্ত, তবে একরকম অন্তর্নিহিত অ্যাসিঙ্ক বাস্তবে কাজ করবে না।

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


2
অগত্যা আপনার কোনও টাইপ সিস্টেমের দরকার নেই। স্বচ্ছ ফিউচার যেমন ECMAScript, Smalltalk, স্বয়ং, সংবাদপত্র, Io, Ioke, সেফ, সহজে টাইও সিস্টেম বা ভাষার সমর্থন ছাড়াই প্রয়োগ করা যেতে পারে। স্মলটালক এবং এর বংশধরগুলিতে, কোনও বস্তু স্বচ্ছভাবে তার পরিচয় পরিবর্তন করতে পারে, ইসমাস্ক্রিপ্টে, এটি স্বচ্ছভাবে তার আকার পরিবর্তন করতে পারে। ফিউচারগুলিকে স্বচ্ছ করতে আপনার প্রয়োজন, অ্যাসিক্রোনির জন্য ভাষার সহায়তার প্রয়োজন নেই।
জার্গ ডব্লু মিটাগ

6
@ জার্গডাব্লু মিটাগ আমি বুঝতে পারছি আপনি কী বলছেন এবং কীভাবে এটি কাজ করতে পারে তবে কোনও ধরণের সিস্টেম ছাড়াই স্বচ্ছ ফিউচারগুলি একই সাথে প্রথম শ্রেণির ফিউচারকে আরও কঠিন করে তোলে, না? আমি ভবিষ্যতে বা ভবিষ্যতের মানগুলিতে বার্তা প্রেরণ করতে চাই কিনা তা বেছে নেওয়ার জন্য আমার কিছু উপায় প্রয়োজন হবে, someValue ifItIsAFuture [self| self messageIWantToSend]জেনেরিক কোডের সাথে সংহত করার পক্ষে এটির চেয়ে ভাল কিছু ভাল ।
আমন

8
@ এ্যামন "প্রতিশ্রুতি এবং প্রতিশ্রুতিগুলি সনেতে হওয়ায় আমি আমার অ্যাসিঙ্ক কোডটি লিখতে পারি" " মনডা এখানে আসলে প্রয়োজন হয় না। থাঙ্কগুলি মূলত কেবল প্রতিশ্রুতি। যেহেতু হাস্কেলের প্রায় সমস্ত মান বাক্সযুক্ত, তাই হাস্কেলের প্রায় সমস্ত মান ইতিমধ্যে প্রতিশ্রুতিবদ্ধ। এজন্য parআপনি খাঁটি হাস্কেল কোডের যে কোনও জায়গায় বেশ কিছুটা টস করতে পারেন এবং নিখরচায় প্যারালাইলেজম পেতে পারেন।
দারথফেনেক

2
অ্যাসিঙ্ক / অপেক্ষার ধারাবাহিকতা ম্যানাদ সম্পর্কে মনে করিয়ে দেয়।
লেস

3
আসলে, ব্যতিক্রম এবং async / প্রতীক্ষা উভয়ই বীজগণিত প্রভাবগুলির উদাহরণ ।
অ্যালেক্স রিঙ্কিং

21

আপনি যা অনুপস্থিত তা হ'ল অ্যাসিঙ্ক ক্রিয়াকলাপের উদ্দেশ্য : এগুলি আপনাকে আপনার অপেক্ষার সময়টি ব্যবহার করার অনুমতি দেয়!

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

প্রোগ্রামাররা অ্যাসিঙ্ক অপারেশনগুলির উদ্ভাবন করার একমাত্র কারণ, অন্যান্য দরকারী গণনার পিছনে সহজাত দীর্ঘমেয়াদী কার্যগুলির বিলম্বকে আড়াল করা । আপনি যদি দরকারী কাজের সাথে অপেক্ষার সময়টি পূরণ করতে পারেন তবে সেই সিপিইউ সময় সাশ্রয় হয়। আপনি যদি না পারেন, ভাল, অ্যাসিঙ্ক হওয়ার কারণে অপারেশনটি কিছুই হারায় না।

সুতরাং, আমি আপনার ভাষাগুলি আপনাকে সরবরাহ করে এমন অ্যাসিঙ্ক অপারেশনগুলিকে আলিঙ্গন করার পরামর্শ দিচ্ছি। তারা আপনার সময় বাঁচানোর জন্য সেখানে আছে।


আমি একটি কার্যকরী ভাষার কথা ভাবছিলাম যেখানে ক্রিয়াকলাপগুলি অবরুদ্ধ হচ্ছে না, সুতরাং এটিতে যদি একটি সুসংগত সিনট্যাক্স থাকে তবে দীর্ঘকাল ধরে চলমান গণনা থ্রেডটি ব্লক করবে না
সিন

6
@ সিন আমি প্রশ্নের মধ্যে এটি খুঁজে পাইনি, এবং প্রশ্নের উদাহরণটি জাভাস্ক্রিপ্ট, যা এই বৈশিষ্ট্যটি নেই। যাইহোক, সাধারণত আপনি বর্ণনা করার সাথে সাথে সমান্তরালকরণের অর্থপূর্ণ সুযোগগুলি খুঁজে পেতে কোনও সংকলকটির পক্ষে এটি কঠিন: এই জাতীয় বৈশিষ্ট্যের অর্থপূর্ণ শোষণের জন্য প্রোগ্রামারকে সুস্পষ্টভাবে চিন্তা করতে হবে যে তারা দীর্ঘ সময় ধরে ডাকার পরে ঠিক কীটি রেখেছিল। আপনি যদি প্রোগ্রামারটিতে এই প্রয়োজনীয়তা এড়াতে রানটাইমকে যথেষ্ট স্মার্ট করেন তবে আপনার রানটাইমটি সম্ভবত কর্মক্ষমতা সাশ্রয় গ্রহণ করবে কারণ এটি ফাংশন কলগুলিতে আক্রমণাত্মকভাবে সমান্তরাল হওয়া দরকার to
মাস্টার

2
সমস্ত কম্পিউটার একই গতিতে অপেক্ষা করে।
বব জার্ভিস - মনিকা 18

2
পছন্দ করেছেন তবে অপেক্ষার সময় তারা কতটা কাজ করতে পারত তার মধ্যে তাদের পার্থক্য রয়েছে ...
মাস্টার মাস্টার

13

কিছু কর.

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

এটি বলেছে, স্পষ্টভাবে এটি সর্বত্র করা ভাল ধারণা নয় । একটি সাধারণ ব্যর্থতা কার্যকরভাবে তাদের কার্যকরকরণের ক্রমিকায়িত করে একটি লুপে অ্যাসিঙ্ক কলগুলি করে। অ্যাসিঙ্ক্রোনাস কলগুলি অন্তর্ভুক্ত থাকা এই ধরণের ত্রুটিটিকে অস্পষ্ট করতে পারে। এছাড়াও, যদি আপনি কোনও Task<T>(বা আপনার ভাষার সমতুল্য) থেকে অন্তর্নিহিত জবরদস্তিকে সমর্থন করেন Tতবে এটি আপনার টাইপচেকার এবং ত্রুটি প্রতিবেদনে কিছুটা জটিলতা / ব্যয় যুক্ত করতে পারে যখন প্রোগ্রামার দু'জনের মধ্যে সত্যিকার অর্থে কোনটি চেয়েছিল তা অস্পষ্ট যখন।

তবে এগুলি দুর্গম সমস্যা নয়। যদি আপনি সেই আচরণকে সমর্থন করতে চান তবে আপনি অবশ্যই অবশ্যই পারতেন, যদিও সেখানে বাণিজ্য বন্ধ থাকবে।


1
আমি মনে করি একটি ধারণা সবকিছুর অ্যাসিঙ্ক ফাংশনগুলিতে মোড়ানো হতে পারে, সিঙ্ক্রোনাস টাস্কগুলি কেবলমাত্র তাত্ক্ষণিকভাবে সমাধান করতে পারে এবং আমরা হ্যান্ডেল করার জন্য এক রকমের একরকম পাই (সম্পাদনা করুন: @amon কেন এটি খারাপ ধারণা ...)
সিন

8
আপনি " কিছু করবেন " এর জন্য কয়েকটি উদাহরণ দিতে পারেন দয়া করে?
বার্গি

2
অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং কোনওভাবেই নতুন নয়, আজকাল লোকেরা প্রায়শই এটি মোকাবেলা করতে হয়।
কিউবিক

1
@ কিউবিক - এটি আমি যতদূর জানি ভাষা বৈশিষ্ট্য হিসাবে। এর আগে এটি কেবল (বিশ্রী) ইউজারল্যান্ড ফাংশন ছিল।
তেলস্তিন

12

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

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

উদাহরণস্বরূপ, স্মলটালক এবং এর বংশধরগুলিতে কোনও বস্তু তার পরিচয় পরিবর্তন করতে পারে, এটি আক্ষরিক অর্থেই একটি পৃথক বস্তু "হয়ে" যেতে পারে (এবং বাস্তবে যে পদ্ধতিটি এটি হয় তাকে বলা হয় Object>>become:)।

একটি দীর্ঘ-চলমান গণনা কল্পনা করুন যা প্রত্যাবর্তন করে a Future<Int>। এই Future<Int>যেমন সব একই পদ্ধতি আছে Int, বিভিন্ন বাস্তবায়নের সঙ্গে ব্যতীত। Future<Int>এর +পদ্ধতিতে অন্য নম্বর যুক্ত হয় না এবং ফলাফলটি ফিরে আসে না, এটি একটি নতুন ফিরিয়ে দেয় Future<Int>যা গণনা মোড়ক করে। এবং তাই এবং তাই ঘোষণা. পদ্ধতি বুদ্ধিমানের একটি ফিরে বাস্তবায়িত করা যাবে না Future<Int>, হবে পরিবর্তে স্বয়ংক্রিয়ভাবে awaitফলাফলের করুন, এবং তারপর কল self become: result., যা বর্তমানে নির্বাহ বস্তুর করতে হবে ( selfঅর্থাৎ Future<Int>) আক্ষরিক পরিণত resultবস্তুর অর্থাত এখন থেকে বস্তুর রেফারেন্সে যে হতে করার জন্য একটি ব্যবহার করা হয়, Future<Int>হয় এখন Intসর্বত্র, ক্লায়েন্টের কাছে সম্পূর্ণ স্বচ্ছ।

বিশেষ বিশেষ তাত্পর্যপূর্ণ-সম্পর্কিত কোনও ভাষা বৈশিষ্ট্যের প্রয়োজন নেই।


ঠিক আছে, তবে এতে উভয়ই সমস্যা আছে Future<T>এবং Tকিছু সাধারণ ইন্টারফেস ভাগ করে নিলে এবং আমি সেই ইন্টারফেস থেকে কার্যকারিতা ব্যবহার করি। এটির becomeফলাফল হওয়া উচিত এবং তারপরে কার্যকারিতাটি ব্যবহার করা উচিত, না? আমি কোনও সমতা অপারেটর বা একটি টু-স্ট্রিং ডিবাগিং উপস্থাপনার মতো জিনিসগুলি নিয়ে ভাবছি।
আমন

আমি বুঝতে পারি যে এটি কোনও বৈশিষ্ট্য যুক্ত করে না, জিনিসটি হ'ল তাত্ক্ষণিকভাবে গণনা এবং দীর্ঘকালীন গণনাগুলি সমাধান করার জন্য আমাদের বিভিন্ন বাক্য গঠন রয়েছে এবং এর পরে আমরা ফলাফলগুলি একই উদ্দেশ্যে অন্যান্য উদ্দেশ্যে ব্যবহার করব। আমি ভাবছিলাম যে আমাদের যদি এমন একটি সিনট্যাক্স থাকতে পারে যা স্বচ্ছতার সাথে উভয়কে পরিচালনা করতে পারে, এটি আরও পাঠযোগ্য এবং তাই প্রোগ্রামারটিকে এটি পরিচালনা করতে হবে না। a + bউভয়ের পূর্ণসংখ্যার মতোই , খ এবং তাত্ক্ষণিকভাবে বা পরে উপলব্ধ থাকলে কোনও বিষয় নয়, আমরা কেবল লিখি a + b(করা সম্ভব করে Int + Future<Int>
দিচ্ছি

@ সিন: হ্যাঁ, আপনি স্বচ্ছ ফিউচারের সাহায্যে এটি করতে পারেন এবং এটি করার জন্য আপনার কোনও বিশেষ ভাষা বৈশিষ্ট্যের প্রয়োজন নেই। আপনি ইতিমধ্যে বিদ্যমান বৈশিষ্ট্যগুলি ব্যবহার করে এটি বাস্তবায়িত করতে পারেন যেমন স্মলটালক, সেল্ফ, নিউজপেয়াক, ইউএস, কর্জ, আইও, আইওক, সেফ, ইসমাস্ক্রিপ্ট এবং দৃশ্যত, যেমনটি আমি পড়েছি পাইথন।
জার্গ ডব্লু মিট্টাগ

3
@ এমন: স্বচ্ছ ফিউচারের ধারণাটি হল আপনি জানেন না যে এটি ভবিষ্যতের। আপনার দৃষ্টিকোণ থেকে, এর মধ্যে কোনও সাধারণ ইন্টারফেস নেই Future<T>এবং Tকারণ আপনার দৃষ্টিকোণ থেকে , কেবল নেইFuture<T>T । এখন, এই দক্ষটি কীভাবে তৈরি করা যায়, কোন ক্রিয়াকলাপগুলি বনাম অ-ব্লক করা ইত্যাদি ব্লক করা উচিত তা অবশ্যই প্রায় প্রকৌশল চ্যালেঞ্জগুলির মধ্যে রয়েছে তবে আপনি ভাষা হিসাবে বা লাইব্রেরির বৈশিষ্ট্য হিসাবে এটি করেন কিনা তা থেকে সত্যই স্বাধীন। প্রশ্নে ওপি দ্বারা স্বচ্ছতা হ'ল প্রয়োজনীয়তা, আমি যুক্তি দেব না যে এটি শক্ত এবং এটি বোধগম্য নয়।
জার্গ ডব্লু মিত্তাগ

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

7

তারা করে (বেশিরভাগ, বেশিরভাগ)। আপনি যে বৈশিষ্ট্যটির সন্ধান করছেন তাকে থ্রেড বলা হয়

থ্রেডগুলির নিজস্ব সমস্যা রয়েছে:

  1. কোডটি যে কোনও সময়ে স্থগিত করা যেতে পারে , আপনি কখনই ধরে নিতে পারবেন না যে জিনিসগুলি "নিজের দ্বারা" পরিবর্তন হবে না। থ্রেড সহ প্রোগ্রামিং করার সময়, আপনার প্রোগ্রামটি পরিবর্তিত জিনিসের সাথে কীভাবে व्यवहार করা উচিত তা ভেবে আপনি অনেক সময় নষ্ট করেন।

    কল্পনা করুন যে কোনও গেম সার্ভার অন্য খেলোয়াড়ের উপর কোনও খেলোয়াড়ের আক্রমণ প্রক্রিয়া করছে। এটার মতো কিছু:

    if (playerInMeleeRange(attacker, victim)) {
        const damage = calculateAttackDamage(attacker, victim);
        if (victim.health <= damage) {
    
            // attacker gets whatever the victim was carrying as loot
            const loot = victim.getInventoryItems();
            attacker.addInventoryItems(loot);
            victim.removeInventoryItems(loot);
    
            victim.sendMessage("${attacker} hits you with a ${attacker.currentWeapon} and you die!");
            victim.setDead();
        } else {
            victim.health -= damage;
            victim.sendMessage("${attacker} hits you with a ${attacker.currentWeapon}!");
        }
        attacker.markAsKiller();
    }
    

    তিন মাস পরে, একজন খেলোয়াড় আবিষ্কার করেন যে নিহত হওয়ার পরে এবং attacker.addInventoryItemsদৌড়ানোর সময় অবিকল লগ অফ করার পরে victim.removeInventoryItemsব্যর্থ হবে, সে তার জিনিসগুলি রাখতে পারে এবং আক্রমণকারীও তার আইটেমগুলির একটি অনুলিপি পায়। তিনি কয়েকবার এটি করেন, পাতলা বাতাস থেকে এক মিলিয়ন টন স্বর্ণ তৈরি করে এবং গেমটির অর্থনীতিতে ক্রাশ করে।

    বিকল্পভাবে, গেমটি শিকারের কাছে একটি বার্তা প্রেরণের সময় আক্রমণকারী লগ আউট করতে পারে এবং সে তার মাথার উপরে একটি "খুনি" ট্যাগ পাবে না, সুতরাং তার পরবর্তী শিকারী তার কাছ থেকে পালাতে পারবেন না।

  2. কোডটি যে কোনও মুহূর্তে স্থগিত করা যেতে পারে , তাই ডেটা স্ট্রাকচারগুলি হেরফের করার সময় আপনার সর্বত্র লকগুলি ব্যবহার করা দরকার। আমি উপরে একটি উদাহরণ দিয়েছি যার একটি গেমের সুস্পষ্ট পরিণতি রয়েছে তবে এটি আরও সূক্ষ্ম হতে পারে। লিঙ্কযুক্ত তালিকার শুরুতে একটি আইটেম যুক্ত করার বিষয়টি বিবেচনা করুন:

    newItem.nextItem = list.firstItem;
    list.firstItem = newItem;
    

    এটি কোনও সমস্যা নয় যদি আপনি বলেন যে থ্রেডগুলি কেবল তখনই স্থগিত করা যাবে যখন তারা I / O করছেন এবং কোনও পর্যায়ে নয়। তবে আমি নিশ্চিত যে আপনি এমন পরিস্থিতিটি কল্পনা করতে পারেন যেখানে আই / ও অপারেশন রয়েছে - যেমন লগিং:

    for (player = playerList.firstItem; player != null; player = item.nextPlayer) {
        debugLog("${item.name} is online, they get a gold star");
        // Oops! The player might've logged out while the log message was being written to disk, and now this will throw an exception and the remaining players won't get their gold stars.
        // Or the list might've been rearranged and some players might get two and some players might get none.
        player.addInventoryItem(InventoryItems.GoldStar);
    }
    
  3. কোডটি যে কোনও মুহূর্তে স্থগিত করা যেতে পারে , সংরক্ষণের জন্য অনেকগুলি রাষ্ট্রের সম্ভাব্য সম্ভাবনা থাকতে পারে। প্রতিটি থ্রেডকে সম্পূর্ণ পৃথক স্ট্যাক দিয়ে সিস্টেম এটির সাথে কাজ করে। তবে স্ট্যাকটি বেশ বড়, সুতরাং 32-বিট প্রোগ্রামে আপনার 2000 টির বেশি থ্রেড থাকতে পারে না। অথবা আপনি স্ট্যাকের আকারটি খুব ছোট করার ঝুঁকিতে হ্রাস করতে পারেন could


3

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

অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং সহজাতভাবে, ভাল, অ্যাসিনক্রোনাস, অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের রেসন ডি'ট্রে বেশিরভাগ ক্ষেত্রে কার্নেলের থ্রেডগুলি ব্লক করা এড়াতে হয়। নোড.জেএস কলব্যাকস বা এসের মাধ্যমে অ্যাসিঙ্ক্রোনসিটি ব্যবহার করে Promiseকোনও ইভেন্ট লুপ থেকে ব্লকিং অপারেশনগুলি প্রেরণের জন্য অনুমতি দেয় এবং জাভাতে নেটটি কলব্যাকের মাধ্যমে অ্যাসিঙ্ক্রোনসিটি ব্যবহার করে বা CompletableFutureঅনুরূপ কিছু করতে।

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

গো, এরলং, এবং হাস্কেল / জিএইচসি আপনার পক্ষে এটি পরিচালনা করতে পারে। আপনি এর মতো কিছু লিখতে পারেন var response = http.get('example.com/test')এবং প্রতিক্রিয়ার জন্য অপেক্ষা করার সময় এটি পর্দার আড়ালে একটি কার্নেল থ্রেড ছেড়ে দিতে পারে। এটি জোরোটাইনস, এরলং প্রক্রিয়াগুলি দ্বারা, বা forkIOঅবরুদ্ধ করার সময় দৃশ্যের পিছনে কার্নেল থ্রেড রেখে দেওয়া হয়, প্রতিক্রিয়ার অপেক্ষার সময় এটি অন্য কিছু করার অনুমতি দেয়।

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

নোড.জেএস এবং জাভা অ্যাসিঙ্ক্রোনাস নন-ব্লকিং কোড সমর্থন করে , তবে গো এবং এরলং সিঙ্ক্রোনাস নন-ব্লকিং কোড সমর্থন করে । তারা উভয়ই বিভিন্ন ট্রেড অফের সাথে বৈধ পন্থা।

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

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


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

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

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

@ লুইস জ্যাকম্যান সিস্টেম প্রোগ্রামিংয়ের জন্য অ্যাসিঙ্ক নন-ব্লকিং সম্পর্কে আপনার শেষ বক্তব্যটি সম্পর্কে কিছুটা ব্যাখ্যা করতে পারেন। অ্যাসিঙ্ক অ-ব্লক করার পদ্ধতির কী কী?
সানপ্রোফিট

@ সুনপ্রফিট অ্যাসিঙ্ক্রোনাস নন-ব্লকিং কেবল একটি সংকলক রূপান্তর (সাধারণত অ্যাসিঙ্ক / অপেক্ষারত), যখন সিঙ্ক্রোনাস অ-ব্লকিংয়ের জন্য ফাংশন কলগুলিতে ফলন পয়েন্টগুলি সন্নিবেশ করা (যা ইনলাইনিংয়ের সাথে সংঘটিত হতে পারে) সন্ধান করে, "ট্র্যাকিং" হ্রাস "(বিএএম এর মতো একটি ভিএম প্রয়োজন) ইত্যাদি garbage আবর্জনা সংগ্রহের মতো এটি ব্যবহারের সহজতা এবং দৃ .়তার জন্য কম রানটাইম জটিলতার বাইরে চলে। সি, সি ++, এবং জাস্টের মতো সিস্টেমের ভাষাগুলি তাদের টার্গেটযুক্ত ডোমেনগুলির কারণে বৃহত্তর রানটাইম বৈশিষ্ট্যগুলি এড়ায়, তাই অ্যাসিঙ্ক্রোনাস অ-ব্লকিং সেখানে আরও বোধগম্য হয়।
লুই জ্যাকম্যান

2

যদি আমি আপনাকে সঠিকভাবে পড়ছি, আপনি একটি সংকালীন প্রোগ্রামিং মডেল চাইছেন, তবে একটি উচ্চ কার্যকারিতা বাস্তবায়ন। যদি এটি সঠিক হয় তবে তা ইতিমধ্যে আমাদের কাছে সবুজ থ্রেড বা উদাহরণস্বরূপ এরলং বা হাস্কেলের প্রক্রিয়া আকারে উপলব্ধ। হ্যাঁ, এটি একটি দুর্দান্ত ধারণা, তবে বিদ্যমান ভাষাগুলিতে পুনর্নির্মাণটি আপনার পছন্দ মতো সবসময় মসৃণ হতে পারে না।


2

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

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

সর্বোচ্চ স্তরের ভাষাটি ইংরেজি বলবে এবং আপনি কী করতে চান তা জানতে কার্যকারীর দক্ষতার উপর নির্ভর করবে। (স্টার ট্রেকের কম্পিউটারটি ভাবুন, বা আলেক্সা সম্পর্কে কিছু জিজ্ঞাসা করুন)) আমরা সেগুলি থেকে অনেক দূরে আছি, তবে আমার প্রত্যাশাটি হ'ল ভাষা / সংকলকটি এতদূর না গিয়ে দৃ rob়, ইচ্ছাকৃত কোড তৈরি করতে আরও বেশি হতে পারে that এআই প্রয়োজন।

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


1

আপনি যে সমস্যাটি বর্ণনা করছেন তা দ্বিগুণ।

  • আপনি যে প্রোগ্রামটি লিখছেন তা বাইরে থেকে দেখার সময় সামগ্রিকভাবে অবিচ্ছিন্নভাবে আচরণ করা উচিত ।
  • এটি করা উচিত নয় কল সাইট এ দৃশ্যমান একটি ফাংশন কল সম্ভাব্য নিয়ন্ত্রণ মানেনা থাকুক বা না থাকুক।

এটি অর্জনের বেশ কয়েকটি উপায় রয়েছে তবে তারা মূলত এটিকে সিদ্ধ করে দেয়

  1. একাধিক থ্রেড থাকা (বিমূর্তির কিছু স্তরে)
  2. ভাষা স্তরে একাধিক ধরণের ক্রিয়াকলাপ রয়েছে, যার সকলকেই এ জাতীয় বলা হয় foo(4, 7, bar, quux)

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

(2) আকর্ষণীয়। এটি ন্যায়বিচার করতে আমাদের পরিচিতি এবং নির্মূলকরণ ফর্মগুলি সম্পর্কে কথা বলা উচিত।

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

আপনি একটি ল্যাম্বডা ব্যবহার করে একটি সিঙ্ক্রোনাস ফাংশন প্রবর্তন করতে পারেন এবং একটি ফাংশন কল দিয়ে এটি নির্মূল করতে পারেন।

সিঙ্ক্রোনাস ফাংশন ভূমিকা:

((x) => {return x + x;})

সিঙ্ক্রোনাস ফাংশন নির্মূল:

f(4)

((x) => {return x + x;})(4)

আপনি এটি অ্যাসিনক্রোনাস ফাংশন ভূমিকা এবং নির্মূলকরণের সাথে বিপরীতে করতে পারেন।

অ্যাসিঙ্ক্রোনাস ফাংশন ভূমিকা

(async (x) => {return x + x;})

অ্যাসিঙ্কোনরাস ফাংশন নির্মূলকরণ (দ্রষ্টব্য: কেবল কোনও asyncকার্যের মধ্যে বৈধ )

await (async (x) => {return x + x;})(4)

এখানে মূল সমস্যাটি হ'ল একটি অ্যাসিঙ্ক্রোনাস ফাংশন একটি প্রতিশ্রুতিবদ্ধ অবজেক্ট উত্পাদনকারী একটি সিঙ্ক্রোনাস ফাংশন

নোড.জেএস repl এ সিঙ্ক্রোনালি অ্যাসিক্রোনাস ফাংশন কল করার একটি উদাহরণ এখানে।

> (async (x) => {return x + x;})(4)
Promise { 8 }

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

এর মতো একটি ভাষা নেওয়া এবং জাভাস্ক্রিপ্টে এটি কমিয়ে আনা সম্ভব, আপনাকে কেবল কার্যকরভাবে সমস্ত ফাংশনকে অবিচ্ছিন্ন করতে হবে।


1

গো ল্যাঙ্গুয়েজ গোরোটাইনস এবং গো ল্যাঙ্গুয়েজ রান টাইমের সাহায্যে আপনি সমস্ত কোড লিখতে পারেন যেন এটি সিঙ্ক্রোন হয়েছে। যদি কোনও গরোটিনে কোনও অপারেশন অবরুদ্ধ হয় তবে অন্যান্য গোরোটিনগুলিতে মৃত্যুদন্ড কার্যকর হয়। এবং চ্যানেলগুলির সাহায্যে আপনি জোরোটাইনগুলির মধ্যে সহজে যোগাযোগ করতে পারেন। এটি জাভাস্ক্রিপ্ট বা অন্যান্য ভাষায় অ্যাসিঙ্ক / অপেক্ষার মতো কলব্যাকের চেয়ে প্রায়শই সহজ। কিছু উদাহরণ এবং ব্যাখ্যার জন্য https://tour.golang.org/concurrency/1 দেখুন ।

তদ্ব্যতীত, এটির সাথে আমার কোনও ব্যক্তিগত অভিজ্ঞতা নেই তবে শুনলাম এর্লংয়েরও একই রকম সুবিধা রয়েছে।

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


আমি প্রায় গো ভাষা ব্যবহার করি নি তবে মনে হয় আপনি সুস্পষ্টভাবে ঘোষণা করেছেন go ..., তাই এটি await ...কি কোনও হিসাবে সমান দেখাচ্ছে ?
সিন

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

2
যদিও গোরআটাইনগুলি এক ধরণের সম্মতিযুক্ত, আমি এগুলিকে async / প্রতীক্ষার মতো একই বালতিতে রাখব না: সমবায় কর্টিনগুলি নয় তবে স্বয়ংক্রিয়ভাবে (এবং পূর্বনির্ধারিত!) নির্ধারিত সবুজ থ্রেড। তবে এটি স্বয়ংক্রিয়ভাবে অপেক্ষা করতে পারে না: গো এর সমতুল্য awaitকোনও চ্যানেল থেকে পড়া <- ch
আমন

@amon যতদূর আমি জানি, গোরআটাইনগুলি রানটাইমের দ্বারা নেটিভ থ্রেডগুলিতে (সাধারণত যথাযথভাবে সত্যিকারের হার্ডওয়্যার সমান্তরালতা সর্বাধিক মাত্রায় সীমাবদ্ধ করার পক্ষে) পর্যায়ে নির্ধারিত হয় এবং সেগুলি পূর্বনির্ধারিতভাবে ওএস দ্বারা নির্ধারিত হয়।
হস্তান্তরকারী

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

1

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

function foo( obj ) {
    obj.x = 2;
    bar();
    log( "obj.x equals 2: " + obj.x );
}

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

async function foo( obj ) {
    obj.x = 2;
    await bar();
    log( "obj.x equals 2: " + obj.x );
}

এখন এটি স্পষ্টভাবে দৃশ্যমান যে এটি bar()একটি অ্যাসিঙ্ক ফাংশন, এবং এটি পরিচালনা করার সঠিক উপায় হ'ল obj.xপরবর্তী সময়ে প্রত্যাশিত মানটি আবার পরীক্ষা করা এবং যে কোনও পরিবর্তন ঘটেছে তার সাথে মোকাবিলা করা।

অন্যান্য জবাব দ্বারা ইতিমধ্যে উল্লিখিত হিসাবে, হাস্কেলের মতো শুদ্ধ কার্যকরী ভাষাগুলি কোনও অংশীদারি / বৈশ্বিক রাষ্ট্রের প্রয়োজনীয়তা এড়িয়ে পুরোপুরিভাবে এ প্রভাব থেকে মুক্তি দিতে পারে। ক্রিয়ামূলক ভাষার সাথে আমার খুব বেশি অভিজ্ঞতা নেই তাই আমি সম্ভবত এর বিরুদ্ধে পক্ষপাতদুষ্ট, তবে আমি মনে করি না যে বৃহত্তর অ্যাপ্লিকেশনগুলি লেখার সময় বিশ্বব্যাপী রাষ্ট্রের অভাব একটি সুবিধা is


0

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

সুতরাং আপনার মত যদি একটি ক্রম থাকে:

const nbOfUsers = getNbOfUsers();

আপনি গ্যারান্টিযুক্ত যে এর মধ্যে আর কিছুই কার্যকর করা হবে না। লক বা অনুরূপ কিছু প্রয়োজন নেই।

তবে, যদি getNbOfUsersঅ্যাসিনক্রোনাস হয় তবে:

const nbOfUsers = await getNbOfUsers();

এর অর্থ এই যে getNbOfUsersরান চলাকালীন কার্যকর কার্যকর হয় এবং অন্যান্য কোড এর মধ্যে চলতে পারে। আপনি যা করছেন তার উপর নির্ভর করে এর জন্য কিছুটা লকিংয়ের প্রয়োজন হতে পারে।

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


আপনি ঠিক বলেছেন, আমার দ্বিতীয় কোডটি যদি getNbOfUsers()কোনও প্রতিশ্রুতি দেয় তবে অবৈধ । তবে এটি আমার প্রশ্নের ঠিক বিন্দু, কেন আমাদের স্পষ্টভাবে এটি অ্যাসিঙ্ক্রোনাস হিসাবে লিখতে হবে, সংকলক এটি সনাক্ত করতে এবং এটি অন্যভাবে স্বয়ংক্রিয়ভাবে পরিচালনা করতে পারে।
চীন 15

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

-4

এটি সি ++ এ std::asyncসি ++ 11 থেকে পাওয়া যায় ।

টেমপ্লেট ফাংশন অ্যাসিঙ্কটি অ্যাসিনক্রোনাস ফাংশনটি চালায় (সম্ভাব্য পৃথক থ্রেড যা থ্রেড পুলের অংশ হতে পারে) এবং একটি স্ট্যান্ড :: ভবিষ্যত দেয় যা শেষ পর্যন্ত সেই ফাংশন কলটির ফলাফল ধারণ করবে।

এবং সি ++ এর সাথে 20 টি কর্টিন ব্যবহার করা যেতে পারে:


5
এটি প্রশ্নের উত্তর বলে মনে হচ্ছে না। আপনার লিঙ্ক অনুসারে: "করোটিনস টিএস আমাদের কী দেয়? তিনটি নতুন ভাষার কীওয়ার্ড: কো_ওয়াইট, কো_ইয়েল্ড এবং কো_রেটন" ... তবে প্রশ্নটি হল কেন আমাদের প্রথম স্থানটিতে একটি await(বা co_awaitএই ক্ষেত্রে) কীওয়ার্ডের প্রয়োজন?
আর্টুরো টরেস সানচেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.