دو تسک هوش مصنوعی من برای تصاحب یک ماوس با هم میجنگیدند
نمایشهای موازی عاملهای هوشمند عالی به نظر میرسند، تا زمانی که دو تسک بخواهند از یک ماوس واحد استفاده کنند.
یک تسک وارد یک سایت میشود. تسک دیگر مرورگر را باز میکند. تسک سوم سعی میکند به یک سوال ساده پاسخ دهد. ناگهان، سیستم روی جای اشتباهی کلیک میکند یا با خطا مواجه میشود. این یک مشکل هوش نیست؛ یک مشکل مدیریت منابع است.
هنگام ساخت CliGate، درس سختی درباره اتوماسیون دسکتاپ آموختم.
تسکهای کدنویسی میتوانند به صورت موازی اجرا شوند. شما میتوانید همزمان با اجرای یک نشست در زمان اجرا، وضعیت آب و هوا را چک کنید. خلاصهسازیهای پسزمینه نیازی به مسدود کردن هیچ چیزی ندارند.
اما دسکتاپ متفاوت است. شما یک کیبورد، یک ماوس و یک صفحه نمایش دارید. اگر دو عامل تصور کنند مالک آن سطح هستند، باعث اختلال در کار یکدیگر میشوند.
اولین واکنش من این بود که وقتی تسک جدیدی میرسد، تسک قدیمی را لغو کنم. این اشتباه بود.
کاربری که میپرسد «تا کجا پیش رفته؟» نباید باعث متوقف شدن فرآیند ورود به سایت شود. کاربری که وضعیت آب و هوا را میپرسد نباید یک تسک دسکتاپ را متوقف کند. بدترین باگ زمانی رخ میدهد که یک عامل، اجرای فعال دیگری را میبیند و به اشتباه خودش را لغو میکند.
باید از برخورد با همزمانی (concurrency) به عنوان یک مشکل پرامپت دست برمیداشتم. باید با آن به عنوان یک مشکل منابع برخورد میکردم.
من سه قانون جدید وضع کردم:
- تسکهای مستقل به صورت موازی اجرا میشوند.
- تسکهایی که به دسکتاپ نیاز دارند باید در صف قرار بگیرند.
- لغو تسک تنها زمانی اتفاق میافتد که کاربر آن را درخواست کند.
در CliGate، ورودی دسکتاپ مانند یک اجارهنامه (lease) عمل میکند. اگر تسکی از ماوس استفاده کند، اجارهنامه را در اختیار دارد. سایر تسکها باید منتظر بمانند.
منطق جدید از این جریان پیروی میکند:
- یک تسک جدید میرسد.
- آیا به دسکتاپ نیاز دارد؟
- اگر نه، آن را به صورت موازی اجرا کن.
- اگر بله و دسکتاپ آزاد است، آن را در اختیار بگیر.
- اگر بله و دسکتاپ مشغول است، آن را در صف قرار بده.
- تنها زمانی لغو کن که کاربر دستور توقف بدهد.
این تغییر، خطاهای گیجکننده را به رفتاری قابل پیشبینی تبدیل کرد. دستیار به جای تلاش مجدد برای کلیک و ایجاد تداخل بیشتر، اکنون حقیقت را میگوید: