PEP 0492 - Python 3.5 үшін бірдей кілт сөз

PEP 0492 бағдарламасы Python 3.5 бағдарламасына async қосады.

Python бұл мәлімдемеден қалай пайда көреді? Мысалы,

 async def read_data(db): data = await db.fetch('SELECT ...') 

Құжаттарға сәйкес бұл қол жеткізілді

db.fetch аяқталғанша және нәтижелерді қайтарғанға дейін read_data сопрограммы сұрауын тоқтатыңыз.

Бұл async кілт сөз жаңа ағындарды жасауға немесе бұрыннан бар сақталған асинхронды ағынның қолданылуына әсер ете ме?

async резервтелген ағыны пайдаланылған жағдайда, ол өздігінен ортақ жіп бар ма?

32
08 июля '15 в 14:19 2015-07-08 14:19 Пол Томпсон 8 шілдеде сағат 14: 06-да 14 шілдеде сұрады
ответ 1 жауап

Жоқ, жергілікті кіші бағдарламалар кез келген ағынмен байланысты емес. Ұжымдық кіші бағдарламалар бірлескен көп тапсыруға мүмкіндік береді, осылайша әрбір бірлескен рәсім ерікті негізде бақылауды қамтамасыз етеді. Екінші жағынан, ағындар бірліктердің арасында еркін нүктелерге ауысады.

Python 3.4 нұсқасынан бұрын, генераторларды пайдаланатын көп-жергілікті кіші кіші жазбаларды жасауға болады; функцияның өрнектеріндегі өрнектерден yield немесе yield from пайдалану арқылы, сіз генератор объектісін орната аласыз, онда код тек генератор арқылы қайталанған кезде орындалады. Оқиғаның қосымша циклдарымен (мысалы, asyncio ) қосымша кітапханалармен бір мезгілде жұмыс істемейтін (I / O күтуі мүмкін) оқиғалар циклын білдіретін және осы уақытта басқа бірлескен процедураны іске қосуға болатын көп-жергілікті кіші бағдарламалар жазуға болады:

 import asyncio import datetime @asyncio.coroutine def display_date(loop): end_time = loop.time() + 5.0 while True: print(datetime.datetime.now()) if (loop.time() + 1.0) >= end_time: break yield from asyncio.sleep(1) 

Жоғарыда келтірілген код yield from asyncio.sleep(1) , оқиға циклі басқа бірлескен процедураны бастауы мүмкін, себебі бұл процедура келесі секундта ештеңе жасамайды.

Генераторлар тек қана кіші бағдарламалар үшін ғана емес, сонымен қатар генератор синтаксисі арқылы жазылатын кіші бағдарламалар жаңа пайдаланушыларды шатастыруы мүмкін болғандықтан, PEP бағдарламасы бірлескен бағдарламаны жазғаныңызды анықтайтын жаңа синтаксисті енгізеді.

PEP-ті іске асыру кезінде жоғарыда көрсетілген үлгі келесі орындарда жазылуы мүмкін:

 async def display_date(loop): end_time = loop.time() + 5.0 while True: print(datetime.datetime.now()) if (loop.time() + 1.0) >= end_time: break await asyncio.sleep(1) 

Нәтижесінде туындайтын coroutine объектіге, оқиға кесінділерін басқару үшін бірлескен кіші қажет; оқиғалар циклі өз кезегінде кез-келген бірлескен кіші бағдарламаны await , ол қазіргі уақытта қандай да бір нәрсені аяқтауға дайын емес жергілікті бағдарламаларды орындайды.

Артықшылықтары, орнатылған қолдаудың көмегімен асинхронды контекст менеджерлерін және иераторларды қолдау үшін қосымша синтаксисті енгізуге болады. Мәтінмәндік менеджерді енгізу немесе одан шығу немесе оны итераторға ауыстыру бірлескен процедураңызда көп нәрсе бола алады, ол басқа кодтың жұмыс істей алатындығын білдіреді, себебі бірдеңе қайтадан күтуде.

42
08 июля '15 в 14:52 2015-07-08 14:52 Жауап Martijn Pieters 08 шілде 2015 жылы 14:52 2015-07-08 14:52

белгілеріне қатысты басқа сұрақтар немесе Сұрақ қою