Skip to main content
 首页 » 编程设计

.net之IronPython 中的多线程

2024年10月25日43leader

我在 IronPython 中有一个“脚本类”,我的应用程序中的脚本通过调用其实例上的方法来工作。我需要从多个线程实现调用脚本。正确的方法是什么?

我有多个担忧:

  • ScriptScope线程安全?信息是矛盾的。 ScriptScope's documentation says :“ScriptScope 不是线程安全的。当多个线程可以访问同一个模块时,主机应该锁定,或者应该为每个线程制作一个副本。”但是,IronRuby 使用相同的 DLR 和 @JimmySchementi says “ScriptRuntime、ScriptEngine 和 ScriptScope 都是线程安全的,旨在用于线程之间。具体来说,ScriptScope 使用线程安全的数据存储,因此 ScriptScope 可以在线程之间共享。”
  • 如果我创建多个 ScriptScope s,这意味着多次执行相同的初始化脚本。假设我运行了 10 个 Python 脚本文件,导入了 5 个程序集,并且总体上执行了相当多的代码来准备好“脚本对象”。有什么方法可以避免为每个线程运行大量相同的代码所花费的时间和内存成本?
  • 正在制作ScriptScope变量线程静态(即应用 ThreadStaticAttribute )并为 Task.Run 使用的每个线程执行初始化怎么走?或者我应该使用 TaskScheduler并发限制,因为多个范围的成本很高?

  • 整体: 如何正确实现在多个线程中对不同参数运行相同的脚本? 脚本必须同时执行,并且不得因竞争条件而崩溃。

    请您参考如下方法:

    1.

    如果 ScriptScope 的文档说它不是线程安全的,相信它,或者至少表现得像你相信的那样。 @JimmySchementi 可能已经查看了当前的实现,并确定它当前是线程安全的,但这并不能保证它在该类的下一个补丁中的行为方式,更不用说下一个主要版本了。

    2.

    是的,您需要初始化每个 ScriptScope。我会尽量减少您需要的 ScriptScope 的数量,如何做到这一点取决于您的设置。如果相关线程的主要目的是托管 ScriptScope,那么您应该使用 ThreadPool,每个线程都有一个 ThreadLocal 。如果这些线程在运行脚本的同时还做其他事情,那么您应该有一个存储 ScriptScopes 的对象池,并且每个线程都可以检查 ScriptScopes,完成工作,然后释放 ScriptScope。

    3.

    首选 ThreadLocal如果您沿着这条路走,则超过 ThreadStatic。