সমকালীনভাবে কোনও বন্দর পড়ার / লেখার সময় পুনরাবৃত্তি এড়ানো?


108

রেবোল 3-এ সমস্ত বন্দর অপারেশনগুলি অ্যাসিনক্রোনাস। সিঙ্ক্রোনাস যোগাযোগের জন্য আমি খুঁজে পেতে পারি কেবল সেই উপায়টি কল করা wait

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

আমি কিভাবে এই কাছাকাছি পেতে পারি?


8
প্রকৃতপক্ষে, আমি মনে করি না বর্তমান আর 3 বাস্তবায়নে এর কোনও সমাধান আছে, সুতরাং আমি "অপেক্ষা" করার জন্য একটি "/ কেবল" পরিশোধন সংযোজন করতে এগিয়ে গিয়েছিলাম, যার সাথে এটি কেবল "অপেক্ষা" সরবরাহিত পোর্টগুলিতে অপেক্ষা করবে , এবং এইভাবে পুনরাবৃত্তি কলগুলি এড়ান। আমার টানার অনুরোধটি এখানে দেখুন: github.com/rebol/rebol/pull/177
শিক্সিন জেং

1
কৌতূহলবশত, আপনার এটি কেন সমকালীন হতে হবে?
toadzky

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

1
আপনি কি পুরোপুরি Rebol ব্যবহার করতে হবে?
রিভনফল

1
হ্যাঁ. এটি সাধারণত সিঙ্ক্রোনাস যোগাযোগের চেয়ে রেবোল 3 সম্পর্কে আরও বেশি প্রশ্ন।
শিকসিন জেং

উত্তর:


1

অ্যাসিঙ্ক্রোনাস এন্ট্রি থেকে সমস্ত বার্তা পাওয়ার জন্য এবং এগুলি ফিফো হিসাবে প্রসেস করার জন্য কেন আপনি "ধরণের" বাফার "ফাংশন তৈরি করেন না (প্রথমত, প্রথম আউট)?

এইভাবে আপনি আপনার পোর্টগুলির অ্যাসিঙ্ক বৈশিষ্ট্যগুলি রাখতে এবং সেগুলি সিঙ্ক মোডে প্রক্রিয়া করতে পারেন।


0

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


0

আমি মনে করি যে 2 টি ডিজাইনের সমস্যা রয়েছে (সম্ভবত হাতে থাকা সরঞ্জামগুলি / সমাধানগুলির অভ্যন্তরীণ)।

  1. Waitখুব বেশি করছে - it will check events for all open ports। দৃ environment় পরিবেশে অপেক্ষার প্রয়োজনীয়তা কেবল সেখানেই প্রয়োগ করা উচিত: প্রতি ডিভাইস, প্রতি বন্দর, প্রতি সকেট ... ভাগ করা সংস্থানগুলির মধ্যে অপ্রয়োজনীয় আন্তঃনির্ভরতা তৈরি করা ভালভাবে শেষ হতে পারে না - বিশেষত জেনে রাখা যে সংস্থানগুলি (আন্তঃনির্ভরতা ছাড়াই) অনেক সমস্যা তৈরি করতে পারে।

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


-1

আপনি কেবল একটি লক ব্যবহার করতে পারেন। কামুনিফিকেশন 1 কিছু বৈশ্বিক লক অবস্থা নির্ধারণ করতে পারে যেমন একটি ভেরিয়েবলের সাথে (নিশ্চিত হয়ে নিন যে এটি থ্রেডটি নিরাপদ)। locked = true। তারপরে যোগাযোগ 2 এটি আনলক না হওয়া পর্যন্ত অপেক্ষা করতে পারে।

loop do
    sleep 10ms
    break if not locked
end
locked = true
handle_communication()

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