【问题标题】:RESTful Webservice with embedded IronPython: engine & scope questions带有嵌入式 IronPython 的 RESTful Web 服务:引擎和范围问题
【发布时间】:2011-02-04 21:05:41
【问题描述】:

我有一个 RESTful C# Web 服务(使用 Open Rasta),我想运行与 CouchDB 对话的 IronPython 脚本。

我可以澄清的一件事是:我多久需要一个新的 python 引擎实例和范围?每个应用程序一个?每个会话?每个请求?

我目前在应用程序级别有一个静态引擎以及一个已编译脚本的字典;然后,根据请求,我创建一个新范围并在该范围内执行代码...

正确吗?线程安全吗?并尽可能地表现出色?

编辑:关于赏金还请回答我在回复 Jeff 时提出的问题:引擎的静态实例是否会导致来自不同客户端的顺序请求排队等待执行?如果是这样,我可能会根据每个请求需要所有内容。

【问题讨论】:

    标签: c# web-services ironpython openrasta


    【解决方案1】:

    每个应用程序一个 ScriptRuntime/ScriptEngine 和每个请求一个 Scope 正是应该这样做的。运行时/引擎是线程安全的,而作用域不是。

    【讨论】:

    • 感谢 Jeff,如果有多个请求同时进入 Web 服务,并且我在应用程序级别有一个静态的引擎/运行时,所有请求都会等待按顺序执行?
    • 你知道吗,我真的不知道。这对我来说从来不是一个问题,所以我从来没有测试过它是如何扩展的。
    • 单个静态引擎可以工作 :) 我自己对此进行了测试,发现发送一个请求以执行一个带有 LONG 线程睡眠的脚本,同时触发另一个请求以运行我的一个正常脚本允许第二个请求在另一个请求休眠时正常执行。
    【解决方案2】:

    除非您的所有代码都是线程安全的,否则按请求是要走的路。使用每个应用程序可能会获得更好的性能(每个会话意味着您在客户端和服务器之间有“会话”的概念),但这意味着“应用程序”中的所有代码都是线程安全的。

    因此,除非您知道您的代码是线程安全的,否则您应该使用每个请求。

    另请注意,只有在以下情况下,每个应用程序才会更快:

    1. 为了使事情线程安全 你没有阻塞任何线程 方式。
    2. 在一定程度上,如果 业务层/数据层是 非常“重”(需要很多 时间来实例化)然后一些 可能会获得性能优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-06
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多