.net IronPython中的多线程

.net IronPython中的多线程,.net,multithreading,thread-safety,ironpython,.net,Multithreading,Thread Safety,Ironpython,我在IronPython中有一个“脚本类”,我的应用程序中的脚本通过在其实例上调用方法来工作。我需要实现从多个线程调用脚本。正确的方法是什么 我有多重顾虑: ScriptScope是线程安全的吗?信息是矛盾的“ScriptScope不是线程安全的。当多个线程可以访问同一个模块时,主机应该锁定,或者应该为每个线程创建一个副本。”但是,IronRuby使用相同的DLR,并且“ScriptRuntime、ScriptEngine和ScriptScope都是线程安全的,设计用于线程之间。特别是,Scri

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

我有多重顾虑:

  • ScriptScope
    是线程安全的吗?信息是矛盾的“ScriptScope不是线程安全的。当多个线程可以访问同一个模块时,主机应该锁定,或者应该为每个线程创建一个副本。”但是,IronRuby使用相同的DLR,并且“ScriptRuntime、ScriptEngine和ScriptScope都是线程安全的,设计用于线程之间。特别是,ScriptScope使用线程安全的数据存储,因此可以在线程之间共享ScriptScope。”

  • 如果我创建多个
    ScriptScope
    s,那就意味着要多次执行同一个初始化脚本“准备好了。有没有办法避免为每个线程运行大量相同的代码所花费的时间和内存

  • 使
    ScriptScope
    变量线程为静态(即,应用
    ThreadStaticAttribute
    )并对
    任务使用的每个线程执行初始化。继续运行
    ?或者我应该使用对并发性有限制的
    TaskScheduler
    ,因为多个作用域的成本很高


  • 总的来说:如何正确实现在多个线程的不同参数上运行同一个脚本?脚本必须同时执行,并且不能由于竞争条件而崩溃。

    因为,看起来您没有得到具体的答案,我有一个通用的答案

    我的一位同事在我以前的工作中使用了IronPhython,处理多线程是必不可少的,因此我可以说,在生产系统的多线程环境中运行IronPython是可能的

    我不知道他是使用自己的锁还是依赖IronPython内部的锁

    我建议:

    a) 自己运行测试。您应该能够编写一个简单的测试来证明它是否安全。下面的代码可能是一个很好的开始:

        [Test]
        public void TwoThreadsWithTheirOwnContexts() {
            //Create two threads
            var tasks = new Task[2];
            tasks[0] = Task.Factory.StartNew(PrintSomethingInIronPython1);
            tasks[1] = Task.Factory.StartNew(PrintSomethingInIronPython2);
            Task.WaitAll(tasks);
        }
    
    b) 还是添加锁吧。在代码中进行锁定可能不是什么大问题,您将消除不确定性

    最终,如果文档说某些东西不是线程安全的,那么您必须证明它是安全的(测试)或是安全的(您自己的锁定)。无论如何,在投入生产之前都应该进行多线程测试。我不认为你在一开始就做这些事情真的会有任何松懈

    关于2: 还是一个建议。创建一个执行一次初始化的池线程,然后重用这些线程。

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

    2. 是的,您需要初始化每个脚本作用域。我会尽量减少您需要的脚本作用域的数量,如何做到这一点将取决于您的设置。如果相关线程的主要目的是承载一个ScriptScope,那么您应该使用一个线程池,每个线程都有一个ThreadLocal。如果这些线程在运行脚本的同时也在做其他事情,那么您应该有一个对象池来存储ScriptScope,每个线程都可以签出ScriptScope,完成工作,然后释放ScriptScope

    3.
    如果您走这条路,请选择ThreadStatic。

    如果我理解正确的话,这就是脚本中的操作方式

    看看这个脚本做了什么,它完全启动了一个具有不同参数的同一事物的新线程

    您可以看到py文件是否完全线程化,并使用IronPython。
    这就是你正确处理线程的方式,而不是以任何其他方式。

    我同情你。自从微软停止正式支持ironpython和ironruby以来,我发现ironpython和ironruby的文档在各个方面都有所欠缺。@JeffreyZhao同意-线程安全是某种东西的内在品质,而不是单元测试用例。