.net - IronPython 中的多线程

标签 .net multithreading thread-safety ironpython

我在 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。

    关于.net - IronPython 中的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16999591/

    相关文章:

    c# - Pivot 上的控件消失

    c# - 在没有 INotifyPropertyChanged 的​​情况下更新 ObservableCollection 成员属性的绑定(bind)

    java - ThreadLocal 用于多线程访问 SimpleDateFormat

    php - Magento 是线程安全的吗?

    c# - LINQ 错误 : Method not recognized

    c# - 如何防止 .Net Web API 的动态 sql 中的 sql 注入(inject)?

    java - 在关闭钩子(Hook)中中断 Java 中的所有线程

    java - 有了ThreadPoolExecutor,如何获取线程池中运行的线程名称?

    multithreading - Hadoop 可以减少 SIFT 的运行时间吗?

    c# - StreamReader ThreadSafe问题?可能吗?