方案:

  • A.网基应用程序服务器(Wonderware《国际会计准则》/系统平台)主持的自动化的对象,与各种设备对工厂车间。
  • CPython托管内部这个应用程序服务器(用 蟒蛇。净).
  • 自动化的对象有脚本功能中(使用一个自定义.净基于语言)。这些脚本呼叫蟒蛇的功能。

蟒蛇职能的一部分的系统来跟踪进行中的工作在该工厂的地板上。该系统的目的是跟踪所生产的部件,沿过程中,确保部件经过该进程在正确的顺序,检查某些条件得到满足沿着该进程。部件的生产历史和部件的状态存储在一个关系数据库,这是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. 我需要能够使用的图书馆从其他环境。a)从一个TurboGears网应用程序。在这种情况下,会议管理是通过TurboGears.b)从IPython壳。在这种情况下,提交/rollback将是明确的。

(我真的很抱歉对于所长的问题。但我觉得我需要解释的情况。也许没有必要的?)

有帮助吗?

解决方案

所描述的装饰适用于长期运行的应用,但是可能会遇到麻烦,如果你不小心分享的对象之间的请求。使错误中较早出现的和不腐败的任何最好是放弃本届会议与会议。删除().

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') 上查询所以你的验证不运行上的陈旧的数据。

其他提示

问问你的WonderWare管理员给你的访问Wonderware历史学家,你可以追踪的价值观的标签很容易地通过MSSQL通过sqlalchemy,你可以调查每隔一段时间。

另一个选择是使用archestra工具包,以听取的内部标记更新,并有一个服务器的部署作为一个平台,在银河系,你可以听从。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top