当前位置: 首页 > 知识库问答 >
问题:

IronPython中的多线程

仉磊
2023-03-14

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

我有多重担忧:

>

如果创建多个ScriptScope,则意味着多次执行相同的初始化脚本。让我们假设我运行了十个Python脚本文件,导入了五个程序集,并且总体上执行了相当多的代码来准备好“脚本对象”。是否有任何方法可以避免为每个线程运行大量相同代码的时间和内存开销?

是否使ScriptScope变量线程静态(即应用ThreadStaticAttie)并为任务使用的每个线程执行初始化。运行要走的路?或者我应该使用具有并发限制的TaskScheduler,因为多个范围的成本很高?

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

共有3个答案

陶征
2023-03-14

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

我的一位同事在我以前的工作中使用了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:同样,这只是一个建议。创建一个执行一次初始化的池线程,然后重用这些线程。

翟新
2023-03-14

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

https://github.com/dretax/Python-Plugins/blob/master/PlutonPlugins/PluIRC/PluIRC.py#L154

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

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

郑茂材
2023-03-14

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

是的,您需要初始化每个ScriptScopes。我会尝试尽量减少您需要的ScriptScopes数量,如何做到这一点将取决于您的设置。如果相关线程的主要目的是托管ScriptScope,那么您应该使用ThreadPool,每个线程都有一个ThreadLocal

如果您走这条路,那么更喜欢ThreadLocal而不是ThreadStatic。

 类似资料:
  • .NET Framework虽然是微软一 手打造的,但却在开源社区频频相见,不能不说是一个奇迹。有人做一些有趣的应用与大家分享,有人则更是把.NET移植到非微软平台(比如著名的MONO和 dotGNU),还有一些人则更为有趣,他们把现有的语言移植到.NET平台上。IronPython就是Python在.NET平台上的实现。 IronPython 是一种在 .NET 及 Mono上的 Python

  • 问题内容: 我想在我的shell脚本中引入多线程功能。 我有一个脚本,使用不同的参数调用该函数。这些函数调用中的每一个都是独立的。 可以并行实例化这些函数调用(而不是脚本)。请让我如何实现这一目标。 问题答案: 当然,只需在命令后添加: 所有这些作业将同时在后台运行。然后,可选命令将等待所有作业完成。 每个命令将在单独的进程中运行,因此从技术上讲,它不是“多线程”,但我相信它可以解决您的问题。

  • 在apcahe服务器中,我希望以cron的形式运行一个PHP脚本,它在后台启动一个PHP文件,并在文件启动后立即退出,并且不等待脚本完成,因为该脚本需要大约60分钟才能完成。如何做到这一点?

  • 我需要在 JavaFX 应用程序的后台使用多个线程。我有一个带有十个按钮的屏幕,我需要将每个线程与启动线程的按钮“绑定”在一起。如果用户按下了启动线程的按钮(在主屏幕中,MainController.java),我需要恢复它以显示包含的信息,以在详细信息屏幕(第二个屏幕,DetailController.java)的控件上显示它。 你推荐什么课程?服务? https://docs.oracle.c

  • 我找到了关于线程安全的代码,但它没有来自给出示例的人的任何解释。我想知道为什么如果我不在“count”之前设置“synchronized”变量,那么count值将是非原子的(总是=200是期望的结果)。谢谢

  • 我有外部光标 和1个内部光标 而处理似乎是 处理:-对于游标c1中的每一条记录,我需要检查游标c1中的员工、项目号和月份是否存在于第二个游标C2中。如果条件满足,我需要更新自定义表。所以这个处理需要很长时间。我如何减少流转时长 在我的游标中,有记录,单个记录在游标中处理。对于每一行来说,这需要花费大量时间,对于所有记录来说,这需要超过