IronPython中的多线程

Ath*_*ari 27 .net multithreading ironpython thread-safety

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

我有多个问题:

  1. ScriptScope线程安全的?信息是矛盾的.ScriptScope的文档说:"ScriptScope不是线程安全的.当多个线程可以访问同一个模块或者应该为每个线程复制时,主机应该锁定." 然而,IronRuby的使用相同的DLR和@JimmySchementi说"ScriptRuntime,ScriptEngine的,和ScriptScope都是线程安全的,设计线程之间使用.具体来说,ScriptScope使用一个线程安全的数据存储,所以ScriptScope可以在线程之间共享".

  2. 如果我创建多个ScriptScopes,那将意味着多次执行相同的初始化脚本.假设我运行了10个Python脚本文件,导入了5个程序集,并且总体上执行了相当多的代码以使"脚本对象"准备就绪.有没有办法避免为每个线程运行大量相同代码的时间和内存成本?

  3. ScriptScope变量线程静态(即应用ThreadStaticAttribute)和执行初始化为每个线程使用Task.Run的方式去?或者我应该使用TaskScheduler带有并发限制,因为多个范围的成本很高?

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

tym*_*tam -1

因为,看起来你没有得到具体的答案,我有一个一般性的答案。

我的一位同事在我之前的工作中使用了 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);
    }
Run Code Online (Sandbox Code Playgroud)

b) 无论如何都要添加锁。在代码中完成锁定可能不是一个大问题,并且您将消除不确定性。

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

回复 2:同样只是一个建议。创建一个池线程,它执行一次初始化,然后重用这些线程。