سؤال

السيناريو:

  • أ .صافي تطبيق يستند إلى ملقم (وونديرواري IAS/منصة نظام) يستضيف أتمتة الكائنات التي التواصل مع مختلف المعدات في المصنع.
  • CPython استضافتها داخل هذا التطبيق server (باستخدام Python for .صافي).
  • أتمتة الكائنات برمجة وظائف المدمج في (باستخدام العرف .صافي القائم على اللغة).هذه البرامج النصية استدعاء الثعبان وظائف.

الثعبان الوظائف هي جزء من نظام لتتبع التقدم في العمل على أرضية المصنع.الغرض من هذا النظام هو أن تتبع إنتاج الحاجيات على عملية ضمان الحاجيات تذهب من خلال عملية في الترتيب الصحيح ، والتحقق من أن يتم استيفاء شروط معينة على طول العملية.القطعة تاريخ الإنتاج و القطعة يتم تخزينها في قاعدة بيانات علائقية ، هذا هو المكان SQLAlchemy يلعب دوره.

على سبيل المثال ، عندما القطعة يمر الماسح الضوئي ، برامج التشغيل الآلي بتشغيل البرنامج النصي التالي (مكتوب في تطبيق ملقم مخصص لغة البرمجة):

' wiget_id and scanner_id provided by automation object
' ExecFunction() takes care of calling a CPython function
retval = ExecFunction("WidgetScanned", widget_id, scanner_id);
' if the python function raises an Exception, ErrorOccured will be true
' in this case, any errors should cause the production line to stop.
if (retval.ErrorOccured) then
    ProductionLine.Running = False;
    InformationBoard.DisplayText = "ERROR: " + retval.Exception.Message;
    InformationBoard.SoundAlarm = True
end if;

السيناريو يدعو WidgetScanned بيثون وظيفة:

# pywip/functions.py
from pywip.database import session
from pywip.model import Widget, WidgetHistoryItem
from pywip import validation, StatusMessage
from datetime import datetime

def WidgetScanned(widget_id, scanner_id):
    widget = session.query(Widget).get(widget_id)
    validation.validate_widget_passed_scanner(widget, scanner) # raises exception on error

    widget.history.append(WidgetHistoryItem(timestamp=datetime.now(), action=u"SCANNED", scanner_id=scanner_id))
    widget.last_scanner = scanner_id
    widget.last_update = datetime.now()

    return StatusMessage("OK")

# ... there are a dozen similar functions

سؤالي هو: كيف يمكنني إدارة أفضل SQLAlchemy دورات في هذا السيناريو ؟ خادم التطبيق هو عملية تشغيل ، عادة تشغيل أشهر بين إعادة تشغيل.خادم التطبيق هو ترابط واحد.

حاليا, لا تفعل ذلك بالطريقة التالية:

تطبيق الديكور إلى وظائف لا تجعل قارئي إلى خادم التطبيق:

# pywip/iasfunctions.py
from pywip import functions

def ias_session_handling(func):
    def _ias_session_handling(*args, **kwargs):
        try:
            retval = func(*args, **kwargs)
            session.commit()
            return retval
        except:
            session.rollback()
            raise
    return _ias_session_handling

# ... actually I populate this module with decorated versions of all the functions in pywip.functions dynamically
WidgetScanned = ias_session_handling(functions.WidgetScanned)

السؤال: هو الديكور أعلاه مناسبة للتعامل مع دورات في تشغيل العملية ؟ يجب أن أتصل session.remove()?

على SQLAlchemy الدورة كائن هو راقب الدورة:

# pywip/database.py
from sqlalchemy.orm import scoped_session, sessionmaker

session = scoped_session(sessionmaker())

أريد أن تبقي إدارة الدورة من الوظائف الأساسية.لسببين:

  1. هناك عائلة أخرى من وظائف تسلسل المهام.تسلسل المهام استدعاء العديد من الوظائف الأساسية.تسلسل واحد وظيفة يجب أن يساوي واحد المعاملات قاعدة البيانات.
  2. أنا بحاجة إلى أن تكون قادرة على استخدام المكتبة من البيئات الأخرى.أ) من TurboGears تطبيق ويب.في هذه الحالة الدورة ويتم إدارة من قبل TurboGears.ب) من IPython قذيفة.في هذه الحالة الالتزام/الاستعادة سوف تكون صريحة.

(أنا آسف حقا عن مسألة طويلة.ولكن شعرت أن هناك حاجة لشرح السيناريو.ربما ليس من الضروري؟)

هل كانت مفيدة؟

المحلول

وصف ديكور مناسب طويلة التطبيقات قيد التشغيل ، لكن يمكنك تشغيل في مشاكل إذا كنت غير قصد تبادل أجسام بين الطلبات.لجعل الأخطاء تظهر في وقت سابق و لا فسادا أي شيء فمن الأفضل تجاهل الدورة مع الدورة.إزالة().

try:
    try:
        retval = func(*args, **kwargs)
        session.commit()
        return retval
    except:
        session.rollback()
        raise
finally:
    session.remove()

أو إذا كان يمكنك استخدام with السياق المدير:

try:
    with session.registry().transaction:
        return func(*args, **kwargs)
finally:
    session.remove()

بالمناسبة, قد ترغب في استخدام .with_lockmode('update') على الاستعلام الخاص بك حتى صحة لا تعمل على بيانات تالفة.

نصائح أخرى

اسأل وونديرواري المسؤول أن تعطيك الوصول إلى وونديرواري مؤرخ, يمكنك تتبع قيم العلامات بسهولة جدا عن طريق MSSQL المكالمات عبر sqlalchemy التي يمكنك استطلاع كل ذلك في كثير من الأحيان.

وثمة خيار آخر هو استخدام archestra أدوات الاستماع الداخلية الوسم التحديثات لديك ملقم نشر منصة في المجرة التي يمكنك الاستماع من.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top