পাইথনের সময়টি কতটা সঠিক? ঘুম ()?


95

আমি এটিকে ভাসমান পয়েন্ট নম্বর দিতে পারি

time.sleep(0.5)

তবে এটি কতটা সঠিক? যদি দিই তো

time.sleep(0.05)

এটি কি সত্যিই প্রায় 50 এমএস ঘুমাবে?

উত্তর:


79

সময় কার্যকারিতা.স্লিপ ফাংশন আপনার অন্তর্নিহিত ওএসের ঘুমের নির্ভুলতার উপর নির্ভর করে। স্টক উইন্ডোজের মতো নন-রিয়েলটাইম ওএসের জন্য আপনি সবচেয়ে ছোট ব্যবধানের জন্য ঘুমাতে পারেন 10-10 মাইল। আমি ন্যূনতম 10-13 মিমি থেকে উপরে তখনকার বেশ কয়েকটি মিলিসেকেন্ডের মধ্যে সঠিক ঘুম দেখেছি।

আপডেট: নীচে উদ্ধৃত দস্তাবেজে যেমন উল্লেখ করা হয়েছে, এমন একটি লুপে ঘুমানো সাধারণ বিষয় যা আপনাকে ঘুম থেকে ওঠার আগে ঘুমাতে ফিরে যেতে নিশ্চিত করবে।

আমার আরও উল্লেখ করা উচিত যে আপনি যদি উবুন্টু চালাচ্ছেন তবে আপনি আরটি কার্নেল প্যাকেজটি ইনস্টল করে (কমপক্ষে উবুন্টু 10.04 এলটিএসে) সিউডো রিয়েল-টাইম কার্নেলটি ব্যবহার করতে পারেন (RT_PREEMPT প্যাচ সেট সহ)।

সম্পাদনা: সংশোধন-অ-রিয়েলটাইম লিনাক্স কার্নেলগুলিতে ন্যূনতম ঘুমের ব্যবধান 1 মিমি 10 মাইলের খুব কাছাকাছি থাকলেও এটি অ-নিরস্তকরণ পদ্ধতিতে পরিবর্তিত হয়।


8
প্রকৃতপক্ষে, লিনাক্স কার্নেলগুলি বেশ কিছু সময়ের জন্য উচ্চতর টিকের হারে খেলাপি হয়েছে, সুতরাং "ন্যূনতম" ঘুম 10 মিমি থেকে 1 মিমি খুব কাছে। এটির কোনও গ্যারান্টিযুক্ত নেই - অন্যান্য সিস্টেমের ক্রিয়াকলাপ সিপিইউ বিতর্ক ছাড়াই এমনকি আপনার পছন্দসই তত্ক্ষণাত কার্নেলটিকে আপনার প্রক্রিয়াটি নির্ধারণ করতে অক্ষম করতে পারে। আমি মনে করি রিয়েলটাইম কার্নেলগুলি ঠিক করার চেষ্টা করছে। তবে, যদি না আপনার সত্যিকারের রিয়েলটাইম আচরণের প্রয়োজন হয়, কেবলমাত্র উচ্চ টিক রেট (কার্নেল এইচজেড সেটিংস) ব্যবহার করে আপনি বিশেষ কোনও কিছু ব্যবহার না করে গ্যারান্টিযুক্ত-তবে-উচ্চ-রেজোলিউশনের ঘুম পাবেন।
গ্লেন মেইনার্ড 21

4
হ্যাঁ আপনি ঠিক বলেছেন, আমি লিনাক্স ২.6.২৪-২৪ দিয়ে চেষ্টা করেছিলাম এবং 1000 হার্জ আপডেটের হারের কাছাকাছি পৌঁছাতে সক্ষম হয়েছি। আমি এটি করার সময় আমি ম্যাক এবং উইন্ডোজে কোডটিও চালাচ্ছিলাম, তাই আমি সম্ভবত বিভ্রান্ত হয়ে পড়েছিলাম। আমি জানি উইন্ডোজ এক্সপিতে কমপক্ষে 10 মাইলের টিক রেট রয়েছে।
জোসেফ লিসি 11:58

উইন্ডোজ 8 এ আমি কেবল 2 এমএসের নিচে পেয়েছি
মার্কমনল

4
এছাড়াও নির্ভুলতা কেবল ওএসের উপর নির্ভর করে না তবে ওএস ও উইন্ডোজ এবং লিনাক্স উভয়ই sleep()ডকস থেকে আরও গুরুত্বপূর্ণ কিছু করতে ব্যস্ত থাকলে তারা " করণীয় নির্ধারিত সময়ের কারণে একটি স্বেচ্ছাসেবী পরিমাণ দ্বারা অনুরোধ করা থেকে স্থগিতাদেশ দীর্ঘ হতে পারে সিস্টেমের অন্যান্য ক্রিয়াকলাপ "।
মার্কমনল

56

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


6
এটি আকর্ষণীয় যে লিনাক্স কীভাবে সর্বদা অনুরোধের চেয়ে কিছুটা বেশি সময় ধরে ঘুমানোর সিদ্ধান্ত নিয়েছে, অন্যদিকে মাইক্রোসফ্ট বিপরীত পদ্ধতিটি বেছে নিয়েছে।
jleahy

4
@ জ্লেহি - লিনাক্স পদ্ধতির বিষয়টি আমার কাছে উপলব্ধি করে: ঘুম আসলেই সময়ের নির্ধারিত সময়ের অগ্রাধিকারের একটি প্রকাশ, যার পরে আপনি আবার নিজেকে নির্ধারকের ইচ্ছায় জমা দেন (যা আপনাকে এখনই মৃত্যুদন্ড কার্যকর করার সময়সূচী করতে পারে বা নাও পারে) ।
18:53 এ 15

4
আপনি কীভাবে ফলাফল পেয়েছেন? আপনার উত্স কোড সরবরাহ করতে পারে? গ্রাফটি সময় এবং ঘুম পরিমাপ করার জন্য বিভিন্ন টাইমার ব্যবহার করার একটি নিদর্শন হিসাবে দেখায় (নীতিগতভাবে, আপনি এমনকি এলোমেলোতার উত্স হিসাবে টাইমারগুলির মধ্যে প্রবাহটিও ব্যবহার করতে পারেন )।
jfs

4
@ জেএফ সেবাস্তিয়ান - আমি যে ফাংশনটি ব্যবহার করেছি তা হ'ল socsci.ru.nl/wilberth/computer/sleepAccuracy.html । সেখানে তৃতীয় গ্রাফ আপনি যা দেখেন তার মতো একটি প্রভাব দেখায় তবে কেবল 1 ‰ ‰
উইলবার্ট

4
@ জেএফ সেবাস্তিয়ান আমি উইন্ডোতে টাইমলক () ব্যবহার করি
উইলবার্ট

26

ডকুমেন্টেশন থেকে :

অন্যদিকে, তাদের ইউনিক্স সমতুল্যের তুলনায় যথার্থতা time()এবং sleep()ভাল: সময়গুলি ভাসমান পয়েন্ট সংখ্যা হিসাবে প্রকাশ করা হয়, time()সর্বাধিক সঠিক সময়টি উপলব্ধ হয় ( gettimeofday যেখানে ইউনিক্স উপলব্ধ থাকে সেখানে ব্যবহার করা হয় ) এবং sleep()ননজারো ভগ্নাংশের সাথে একটি সময় গ্রহণ করবে (ইউনিক্স selectব্যবহৃত হয় এটি কার্যকর করার জন্য, যেখানে উপলব্ধ)।

এবং আরও নির্দিষ্টভাবে কব্জি sleep():

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


4
"যে কোনও ধরা পড়ার সিগন্যাল সেই সংকেতের ধরার রুটিন কার্যকর করার পরে ঘুমকে) শেষ করে দেবে" এমন কি কেউ ব্যাখ্যা করতে পারেন? এটি কোন সংকেতকে উল্লেখ করছে? ধন্যবাদ!
দিয়েগো হেরানজ

4
সিগন্যালগুলি নোটিফিকেশনের মতো যা ওএস পরিচালনা করে ( en.wikedia.org/wiki/Unix_signal ), এর অর্থ হ'ল ওএস যদি একটি সংকেত ধরা দেয় তবে সেই সংকেতটির চিকিত্সা করার পরে ঘুম () শেষ হয়ে যায়।
আরিয়ানজেএম

24

উইলবার্টের উত্তরের জন্য এখানে আমার ফলোআপ: ম্যাক ওএস এক্স ইয়োসেমাইটের জন্য একই, কারণ এটি এখনও খুব বেশি উল্লেখ করা হয়নি।ম্যাক ওএস এক্স ইয়োসেমাইটের ঘুমের আচরণ

দেখে মনে হচ্ছে যে আপনি যে সময়টি অনুরোধ করেছেন তার চেয়ে প্রায় 1.25 বার বেশি সময় ঘুমায় এবং কখনও কখনও আপনি অনুরোধের সময় 1 এবং 1.25 বারের মধ্যে ঘুমায়। এটি প্রায় কখনই নয় (1000 টি নমুনার মধ্যে দ্বিগুণ) আপনার অনুরোধ করা সময়ের চেয়ে 1.25 গুণ বেশি ঘুমায়।

এছাড়াও (স্পষ্টরূপে দেখানো হয়নি) আপনি প্রায় 0.2 এমএস এর নীচে না আসা পর্যন্ত 1.25 সম্পর্কটি বেশ ভালভাবে ধরেছে বলে মনে হচ্ছে, এরপরে এটি কিছুটা अस्पष्ट হওয়া শুরু করবে। অতিরিক্তভাবে, অনুরোধ করা সময়ের পরিমাণ 20 এমএসের বেশি হওয়ার পরে আপনার অনুরোধের চেয়ে আসল সময়টি প্রায় 5 এমএস দীর্ঘ স্থায়ী হয়ে যায় বলে মনে হয়।

আবার এটি sleep()উইন্ডোজ বা যে কোনও লিনাক্স কার্নাল উইলবার্ট ব্যবহার করছিল তার তুলনায় ওএস এক্সের ক্ষেত্রে সম্পূর্ণ আলাদা বাস্তবায়ন বলে মনে হচ্ছে ।


আপনি কি বেথমার্কের গিথব / বিটবাকেটে সোর্স কোড আপলোড করতে পারবেন?
jfs

4
আমি চেষ্টা করেছি এটা আমার মেশিনে। ফলাফল @ উইলবার্টের উত্তরের অনুরূপ
jfs

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

16

আপনি কেন খুঁজে পাবেন না:

from datetime import datetime
import time

def check_sleep(amount):
    start = datetime.now()
    time.sleep(amount)
    end = datetime.now()
    delta = end-start
    return delta.seconds + delta.microseconds/1000000.

error = sum(abs(check_sleep(0.050)-0.050) for i in xrange(100))*10
print "Average error is %0.2fms" % error

রেকর্ডটির জন্য, আমি আমার এইচটিপিসিতে প্রায় 0.1 মিমি ত্রুটি এবং আমার ল্যাপটপে 2 এমএস, দুটি লিনাক্স মেশিনই পেয়েছি।


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

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

4

একটি ছোট সংশোধন, বেশিরভাগ লোক উল্লেখ করেছেন যে ঘুম খুব শীঘ্রই একটি সংকেত দ্বারা শেষ করা যেতে পারে। ইন 3.6 ডক্স এটা বলছেন,

৩.৫ সংস্করণে পরিবর্তিত হয়েছে: সিগন্যালের মাধ্যমে ঘুম ব্যাহত হলেও ফাংশনটি এখন কমপক্ষে সেকেন্ডে ঘুমায়, সিগন্যাল হ্যান্ডলার ব্যতিক্রম উত্থাপন ব্যতীত ( যুক্তির জন্য পিইপি 475 দেখুন )।


3

আপনি ঘুম সম্পর্কে সত্যিই কোনও গ্যারান্টি দিতে পারবেন না, কেবলমাত্র যতক্ষণ আপনি এটি বলেছেন ততক্ষণ ঘুমের সর্বোত্তম চেষ্টা করবে (সংকেতগুলি আপনার ঘুমকে মেরে ফেলতে পারে সময় শেষ হওয়ার আগেই এবং আরও অনেক কিছুই এটিকে চালিয়ে দিতে পারে দীর্ঘ)।

নিশ্চিতভাবে আপনি একটি স্ট্যান্ডার্ড ডেস্কটপ অপারেটিং সিস্টেমে সর্বনিম্ন যে পরিমাণটি পেতে পারেন তা প্রায় 16 মিমি হতে চলেছে (টাইমার গ্রানুলারিটি প্লাস প্রসঙ্গে 10 সেকেন্ডের জন্য ঘুমাতে।

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


4
ডকুমেন্টেশন অন্যথায় বলে:> আসল সাসপেনশন সময়টি অনুরোধ করা চেয়ে কম হতে পারে কারণ কোনও সিগন্যাল ধরা পড়ার রুটিন কার্যকর করার পরে কোনও ধরা সিগন্যাল ঘুম () নিরব করে দেবে।
গ্লেন মেইনার্ড 21

আহ ফর্সা পয়েন্ট, পোস্টটি স্থির করে নিন, যদিও দীর্ঘ ঘুমানো () কম হওয়ার চেয়ে অনেক বেশি সম্ভাবনা রয়েছে।
নিক বেস্টিন

4
আড়াই বছর পরে ... ডকুমেন্টেশন এখনও মিথ্যা। উইন্ডোজে, সিগন্যালগুলি ঘুমকে শেষ করে না ()। পাইথন ৩.২, উইনএক্সপি এসপি 3-তে পরীক্ষিত।
ডেভ

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

4
সিঙ্গলস এবং উইন্ডোজ কেবল নির্বোধ। উইন্ডোজে পাইথন সময় s
schlenk

1

আপনার যদি আরও নির্ভুলতার প্রয়োজন হয় বা ঘুমের সময় কম হয় তবে নিজের তৈরি করার বিষয়টি বিবেচনা করুন:

import time

def sleep(duration, get_now=time.perf_counter):
    now = get_now()
    end = now + duration
    while now < end:
        now = get_now()


0
def start(self):
    sec_arg = 10.0
    cptr = 0
    time_start = time.time()
    time_init = time.time()
    while True:
        cptr += 1
        time_start = time.time()
        time.sleep(((time_init + (sec_arg * cptr)) - time_start ))

        # AND YOUR CODE .......
        t00 = threading.Thread(name='thread_request', target=self.send_request, args=([]))
        t00.start()

ঘুমের যুক্তিটি পাস করার জন্য কোনও ভেরিয়েবল ব্যবহার করবেন না () আপনার অবশ্যই গণনাটি সরাসরি ঘুমের মধ্যে inোকাতে হবে ()


এবং আমার টার্মিনাল ফিরে

1 ───── 17: 20: 16.891 ───────────────────

2 ───── 17: 20: 18.891 ───────────────────

3 ───── 17: 20: 20.891 ───────────────────

4 ───── 17: 20: 22.891 ───────────────────

5 ───── 17: 20: 24.891 ───────────────────

....

689 ─── 17: 43: 12.891 ────────────────────

690 ─── 17: 43: 14.890 ────────────────────

691 ─── 17: 43: 16.891 ────────────────────

692 ─── 17: 43: 18.890 ────────────────────

693 ─── 17: 43: 20.891 ────────────────────

...

727 ─── 17: 44: 28.891 ────────────────────

728 ─── 17: 44: 30.891 ────────────────────

729 ─── 17: 44: 32.891 ────────────────────

730 ─── 17: 44: 34.890 ────────────────────

731 ─── 17: 44: 36.891 ────────────────────


0
def test():
    then = time.time()  # get time at the moment
    x = 0
    while time.time() <= then+1:  # stop looping after 1 second
        x += 1
        time.sleep(0.001)  # sleep for 1 ms
    print(x)

উইন্ডোজ 7 / পাইথন 3.8 1000আমার জন্য ফিরে আসল, এমনকি যদি আমি ঘুমের মান সেট করে0.0005

সুতরাং একটি নিখুঁত 1ms

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