در این بخش API های ASYNC/AWAIT ASYNCIO در سطح بالا برای ایجاد و مدیریت زیر فرآیندها توضیح داده شده است.
در اینجا نمونه ای از چگونگی Asyncio می تواند یک فرمان پوسته را اجرا کند و نتیجه خود را بدست آورد:
از آنجا که تمام عملکردهای زیر پردازش Asyncio ناهمزمان هستند و Anyncio ابزارهای زیادی را برای کار با چنین توابع فراهم می کند ، اجرای و نظارت بر چندین فرآیند به طور موازی آسان است. در واقع اصلاح مثال فوق برای اجرای چندین دستور به طور همزمان بی اهمیت است:
همچنین بخش نمونه ها را نیز ببینید.
ایجاد زیر فرآیند
Coroutine asyncio. CREATE_SUBPROCESS_EXEC (برنامه ، * args ، stdin = none ، stdout = none ، stderr = none ، limit = none ، ** kwds)
یک زیرمجموعه ایجاد کنید.
آرگومان محدودیت ، حد بافر را برای بسته بندی های StreamReader برای پردازش تنظیم می کند.
یک نمونه فرآیند را برگردانید.
برای پارامترهای دیگر به اسناد loop. subprocess_exec () مراجعه کنید.
تغییر در نسخه 3. 10: پارامتر حلقه را حذف کرد.
Coroutine asyncio. CREATE_SUBPROCESS_SHELL (cmd ، stdin = هیچ ، stdout = none ، stderr = none ، limit = none ، ** kwds) ¶
دستور CMD Shell را اجرا کنید.
آرگومان محدودیت ، حد بافر را برای بسته بندی های StreamReader برای پردازش تنظیم می کند.
یک نمونه فرآیند را برگردانید.
برای پارامترهای دیگر به مستندات loop. subprocess_shell () مراجعه کنید.
این مسئولیت برنامه است که اطمینان حاصل شود که از همه فضای سفید و شخصیت های خاص به طور مناسب نقل شده است تا از آسیب پذیری های تزریق پوسته جلوگیری شود. عملکرد shlex. quote () می تواند برای فرار صحیح از فضای سفید و شخصیت های پوسته خاص در رشته هایی که برای ساخت دستورات پوسته استفاده می شوند ، استفاده شود.
تغییر در نسخه 3. 10: پارامتر حلقه را حذف کرد.
در صورت استفاده از ProactoreVentLoop ، زیر فرآیندهای برای ویندوز در دسترس هستند. برای جزئیات بیشتر به Subprocess Support در ویندوز مراجعه کنید.
ثابت ها
می توان به پارامترهای stdin ، stdout یا stderr منتقل کرد.
اگر لوله به آرگومان stdin منتقل شود ، ویژگی Process. Stdin به یک نمونه StreamWriter اشاره می کند.
اگر لوله به آرگومان های STDOUT یا STDERR منتقل شود ، ویژگی های Process. Stdout و Process. Stderr به نمونه های StreamReader اشاره می کنند.
مقدار ویژه ای که می تواند به عنوان آرگومان STDERR مورد استفاده قرار گیرد و نشان می دهد که خطای استاندارد باید به خروجی استاندارد هدایت شود.
مقدار ویژه ای که می تواند به عنوان آرگومان STDIN ، STDOUT یا STDERR برای عملکردهای ایجاد پردازش استفاده شود. این نشان می دهد که از پرونده ویژه OS. Devnull برای جریان فرآیند مربوطه استفاده می شود.
تعامل با زیر فرآیند
هر دو توابع Create_SubProcess_exec () و Create_SubProcess_Shell () نمونه های کلاس فرآیند را برمی گردانند. فرآیند یک بسته بندی سطح بالا است که امکان برقراری ارتباط با زیرمجموعه ها و تماشای تکمیل آنها را فراهم می کند.
کلاس asyncio. subprocess. روند ¶
شیئی که فرآیندهای سیستم عامل ایجاد شده توسط Create_Subprocess_Exec () و توابع Create_Subprocess_Shell () را می پیچد.
این کلاس به گونه ای طراحی شده است که دارای یک API مشابه با زیر پردازش است.
بر خلاف پوپن ، نمونه های فرآیند معادل روش نظرسنجی () ندارند.
روشهای ارتباط () و منتظر () پارامتر زمان بندی ندارند: از عملکرد Wait_for () استفاده کنید.
روش Process. Wait () ناهمزمان است ، در حالی که روش subprocess. popen. wait () به عنوان یک حلقه شلوغ مسدود کننده اجرا می شود.
پارامتر Universal_Newlines پشتیبانی نمی شود.
صبر کنید تا روند کودک خاتمه یابد.
ویژگی ReturnCode را تنظیم و برگردانید.
این روش می تواند هنگام استفاده از stdout = pipe یا stderr = pipe و فرآیند کودک آنقدر خروجی تولید کند که در انتظار بافر لوله سیستم عامل برای پذیرش داده های بیشتر باشد. برای جلوگیری از این شرایط از روش Colorctical () هنگام استفاده از لوله استفاده کنید.
تعامل با فرآیند:
ارسال داده به stdin (اگر ورودی هیچ کدام نیست) ؛
داده های STDOUT و STDERR را بخوانید ، تا زمان رسیدن EOF.
صبر کنید تا فرآیند خاتمه یابد.
آرگومان ورودی اختیاری داده ها (شی بایت) است که به فرآیند کودک ارسال می شود.
یک Tuple (stdout_data ، stderrr_data) را برگردانید.
اگر در هنگام نوشتن ورودی به stdin ، استثناء BrokenPipeError یا ConnectionReseTerror مطرح شود ، استثناء نادیده گرفته می شود. این شرایط زمانی اتفاق می افتد که فرآیند قبل از نوشتن همه داده ها به stdin انجام شود.
در صورت تمایل به ارسال داده ها به stdin فرآیند ، این فرآیند باید با stdin = pipe ایجاد شود. به طور مشابه ، برای به دست آوردن هر چیز دیگری غیر از هیچ یک در نتیجه TUPLE ، این فرآیند باید با آرگومان های STDOUT = لوله و/یا stderr = لوله ایجاد شود.
توجه داشته باشید که داده های خوانده شده در حافظه بافر می شوند ، بنابراین اگر اندازه داده بزرگ یا نامحدود باشد از این روش استفاده نکنید.
سیگنال سیگنال را به فرآیند کودک می فرستد.
در ویندوز ، Sigterm یک نام مستعار برای خاتمه () است. ctrl_c_event و ctrl_break_event را می توان به فرآیندهای شروع شده با یک پارامتر CreationFlags ارسال کرد که شامل Create_New_Process_Group است.
روند کودک را متوقف کنید.
در سیستم های POSIX این روش سیگنال را ارسال می کند.
در ویندوز عملکرد WIN32 API TerminateProcess () برای متوقف کردن روند کودک فراخوانی می شود.
روند کودک را بکشید.
در سیستم های POSIX این روش Sigkill را به روند کودک می فرستد.
در ویندوز این روش نام مستعار برای خاتمه () است.
جریان ورودی استاندارد (StreamWriter) یا هیچ کدام در صورت ایجاد فرآیند با stdin = none.
جریان خروجی استاندارد (streamReader) یا هیچ کدام در صورت ایجاد فرآیند با stdout = هیچ.
جریان خطای استاندارد (StreamReader) یا هیچ کدام در صورت ایجاد فرآیند با STDERR = NO.
از روش ارتباط () به جای Process. Stdin. Write () استفاده کنید ، Await Process. stdout. read () یا Await Process. Stderr. Read (). این امر به دلیل مکث خواندن یا نوشتن و مسدود کردن روند کودک از بن بست ها جلوگیری می کند.
شماره شناسایی فرآیند (PID).
توجه داشته باشید که برای فرآیندهای ایجاد شده توسط تابع create_subprocess_shell () ، این ویژگی PID پوسته تخم ریزی شده است.
کد فرآیند را هنگام خروج برگردانید.
یک مقدار هیچ نشان نمی دهد که این روند هنوز خاتمه نیافته است.
مقدار منف ی-N نشان می دهد که کودک توسط سیگنال N (فقط POSIX) خاتمه یافته است.
زیرمجموعه و موضوعات
حلقه رویداد استاندارد Asyncio به طور پیش فرض از زیر فرآیندهای اجرای موضوعات مختلف پشتیبانی می کند.
در فرآیندهای ویندوز فقط توسط ProactoreVentLoop (پیش فرض) ارائه شده است ، SelectoreVentLoop هیچ پشتیبانی از زیر پردازش ندارد.
در Unix Watchers برای انتظار برای فرآیند استفاده می شود ، برای اطلاعات بیشتر به تماشاگران فرآیند مراجعه کنید.
تغییر در نسخه 3. 8: UNIX برای استفاده از ThreadchildWatcher برای فرآیندهای تخم ریزی از موضوعات مختلف و بدون هیچ محدودیتی تغییر یافت.
تخم ریزی یک زیرمجموعه با ناظر کودک فعلی غیرفعال ، RuntimeError را افزایش می دهد.
توجه داشته باشید که اجرای حلقه رویداد جایگزین ممکن است محدودیت های خاص خود را داشته باشد. لطفاً به مستندات آنها مراجعه کنید.
مثال ها¶
مثالی با استفاده از کلاس فرآیند برای کنترل یک زیر فرآیند و کلاس StreamReader برای خواندن از خروجی استاندارد آن.