【问题标题】:Should I run each plugin in its own thread?我应该在自己的线程中运行每个插件吗?
【发布时间】:2011-11-01 14:22:41
【问题描述】:
在我的游戏中,用户可以加载自定义脚本。
通常会加载 50-100 个脚本。
每个脚本都会通过其 Update 方法在每一帧中调用。
- 当一个脚本崩溃时,其他脚本不应该受到影响。
- 脚本更新方法允许每帧最多运行 1 毫秒。所以我还需要能够中止被冻结/没有及时反应的脚本。
我该怎么做?我认为每秒启动 3000 - 6000 个线程并不是最佳实践。
一旦在循环中调用 Update 并等待 16 毫秒,我也无法启动线程,因为脚本需要与游戏同步。脚本依赖于每帧运行。
线程池在这里是正确的选择吗?如果是这样,我将如何中止超时的脚本?
【问题讨论】:
标签:
c#
multithreading
scripting
threadpool
【解决方案1】:
简短:防止恶意代码很难。
1.当一个脚本崩溃时,其他脚本不应该受到影响:要实现这一点,在 Windows 中唯一可靠的方法是在单独的进程中运行每个脚本。 IE。由“脚本”引起的 StackOverflow 异常将使您的进程停止运行。跨进程通信不太可能轻松满足您的性能要求。
2.每个脚本 1 毫秒:中止线程是一种解决方案。避免大量线程(超过十个线程是有问题的:在线程之间切换会降低性能,堆栈空间会占用所有内存,并且通常同步状态跨线程很有趣)。考虑不要重新启动表现不佳的“脚本” - 这样您就不必担心过多的 Thread.Abort 调用。请注意,不需要杀死线程将杀死与“脚本”相关的所有内容,因为它可能已经产生了自己的线程/异步操作/线程池任务......