নোড.জেএস এর কনসোল.লগ অ্যাসিনক্রোনাস?


95

হয় console.log/debug/warn/errorNode.js asynchrounous মধ্যে? আমার অর্থ জাভাস্ক্রিপ্ট কোড সম্পাদন স্থগিত না হওয়া পর্যন্ত জিনিসগুলি স্ক্রিনে মুদ্রিত হবে বা এটি পরবর্তী পর্যায়ে মুদ্রণ করবে?

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

উত্তর:


102

আপডেট: নোড 0.6 দিয়ে শুরু করা এই পোস্টটি অপ্রচলিত, যেহেতু স্টাডাউট এখন সিঙ্ক্রোনাস

আচ্ছা আসুন দেখি console.logআসলে কি হয়।

সবার আগে এটি কনসোল মডিউলটির অংশ :

exports.log = function() {
  process.stdout.write(format.apply(this, arguments) + '\n');
};

সুতরাং এটি কেবল কিছু ফর্ম্যাটিং করে এবং process.stdoutএ পর্যন্ত অ্যাসিক্রোনাস কিছুই লিখেনি।

process.stdoutএকটি সংগ্রহকারী হয় প্রারম্ভকালে সংজ্ঞায়িত যা প্রখর রৌদ্রে সক্রিয়া করা হয়, আমি কিছু ব্যাখ্যা করার কিছু মন্তব্য জুড়েছেন:

.... code here...
process.__defineGetter__('stdout', function() {
  if (stdout) return stdout;                            // only initialize it once 

  /// many requires here ...

  if (binding.isatty(fd)) {                             // a terminal? great!
    stdout = new tty.WriteStream(fd);
  } else if (binding.isStdoutBlocking()) {              // a file?
    stdout = new fs.WriteStream(null, {fd: fd});
  } else {
    stdout = new net.Stream(fd);                        // a stream? 
                                                        // For example: node foo.js > out.txt
    stdout.readable = false;
  }

  return stdout;
});

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

আসুন এটি পরীক্ষা!

var data = '111111111111111111111111111111111111111111111111111';
for(var i = 0, l = 12; i < l; i++) {
    data += data; // warning! gets very large, very quick
}

var start = Date.now();
console.log(data);
console.log('wrote %d bytes in %dms', data.length, Date.now() - start);

ফলাফল

....a lot of ones....1111111111111111
wrote 208896 bytes in 17ms

real    0m0.969s
user    0m0.068s
sys  0m0.012s

সকেটগুলির সামগ্রী মুদ্রণ করতে টার্মিনালের প্রায় 1 সেকেন্ডের প্রয়োজন হয়, তবে নোডটিকে টার্মিনালে ডেটা ঠেকাতে কেবল 17 মিলিসেকেন্ডের প্রয়োজন।

একই স্ট্রিম কেসের ক্ষেত্রেও যায় এবং ফাইল কেসটি হ্যান্ডেল অ্যাসিনক্রোনাস হয়

সুতরাং হ্যাঁ নোড.জেস এর অ-অবরুদ্ধ প্রতিশ্রুতিগুলির প্রতি সত্য।



4
আমি মনে করি এটি এখন অপ্রচলিত: github.com/nodejs/node/issues/3524#issuecomment-151097761
tforgione

@ আইভোওয়েজেল এটি অপ্রচলিত হওয়ায় আমি এখনই এটিকে নিম্নমুখী করতে যাচ্ছি।
ইভান ক্যারল

আমি জানি এই অপ্রচলিত এবং সবকিছু, কিন্তু আপনি বলুন "কিছুই অ্যাসিঙ্ক্রোনাস এতদূর" অবিলম্বে পরে process.stdout.write()যেখানে write()সংজ্ঞা অ্যাসিঙ্ক্রোনাস হয় ...
binki

27

কনসোল.ওয়ার্ন () এবং কনসোল.অরার () ব্লক করছে। অন্তর্নিহিত সিস্টেমের কলগুলি সফল না হওয়া পর্যন্ত তারা ফিরবে না।

হ্যাঁ, স্টাডাউটে লেখা সমস্ত কিছুই সরিয়ে দেওয়ার আগে কোনও প্রোগ্রামের প্রস্থান সম্ভব। প্রসেস.এক্সিট () তত্ক্ষণাত নোডের সমাপ্তি ঘটবে, এমনকি স্টাডআউটে এখনও সারিবদ্ধ লেখক থাকলেও। এই আচরণটি এড়াতে আপনার কনসোল.ওয়ার্ন করা উচিত।


4
উইন্ডোজে নোড 0.10.25 এর ক্ষেত্রে এটি সত্য নয়। console.warn()এবং console.error()একই অন-ব্লক করা আচরণ আছে console.log()উইন্ডোজে সমস্যাটি সমাধান করার জন্য একটি প্যাকেজও রয়েছে
লুসিও পাইভা

12

আমার উপসংহার, নোড.জেএস 10 পড়ার পরে। * ডক্স (নীচে সংযুক্ত)। আপনি লগিংয়ের জন্য কনসোল.লগ ব্যবহার করতে পারেন, কনসোল.লগ সিঙ্ক্রোনাস এবং নিম্ন স্তরের সি তে প্রয়োগ করা হয়েছে। কনসোল.লগ সিঙ্ক্রোনিক হলেও এটি যদি আপনি প্রচুর পরিমাণে ডেটা লগ না করে তবে পারফরম্যান্স সমস্যার কারণ হয়ে দাঁড়াবে না।

(নীচের কমান্ড লাইন উদাহরণ প্রদর্শন, কনসোল.লগ async এবং কনসোল.অরর সিঙ্ক হয় )

নোড.জেএস ডক এর উপর ভিত্তি করে

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

এটি হ'ল নিম্নলিখিত উদাহরণে স্ট্ডআউট অ-ব্লক করা হচ্ছে যখন স্ট্ডার ব্লক করছে:

$ node script.js 2> error.log | tee info.log

প্রতিদিনের ব্যবহারে, ব্লকিং / নন-ব্লকিং ডিকোটোমি এমন কিছু নয় যা আপনি> বিপুল পরিমাণে ডেটা লগ না করে আপনার চিন্তিত হওয়া উচিত।

আশা করি এটা সাহায্য করবে


"বিশাল পরিমাণের ডেটা" কী? এটি কি কনসোল.লগের কল সংখ্যা বা মোট পরিমাণটি লিখিত হয়েছে দ্বারা সংজ্ঞায়িত করা হয়েছে? একটি বিশাল 1KB / এমএস, 1 এমবি / এমএস, 1 জিবি / এমএস কী?
ম্যাটজি

3

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

if (process.stdout._handle) process.stdout._handle.setBlocking(true);

লিনাক্স কেবল উবুন্টু নয়।
ওজানমুয়েস

ধন্যবাদ, আমার গোঁড়া মন্তব্য মাফ করবেন কিন্তু ডেবিয়ান আমার দূর্বলতা এবং এটি সবাই কে লিনাক্স ব্যবহার শুরু আজকাল মনে উবুন্টু বলে মনে হয় হয় লিনাক্স (আপনি ছাড়া, আমি জানি যে আপনি তাদের একজন না)। আপনার দিনটি শুভ হোক :)
ওজনমুয়েজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.