2

我有一个尝试使用 Perl 线程(使用线程)设置的 Perl 脚本。当我运行简单的测试时,一切正常,但是当我执行我的实际脚本(其中有运行多个 SQL Plus 会话的线程)时,每个 SQL Plus 会话按顺序运行(即线程 1 的 sqlplus 运行步骤 1-5,然后线程 2 的 sqlplus运行步骤 6-11 等)。

我以为我明白线程会进行并发处理,但有些不对劲。有什么想法,还是我应该做一些其他的 Perl 魔法?

4

3 回答 3

4

几种可能的解释:

  1. 您是在多核处理器还是多处理器机器上运行此脚本?如果你只有一个 CPU,任何时候只有一个线程可以使用它。

  2. 步骤 1-6 涉及的事务或锁是否会阻止它同时完成?

  3. 您确定您正在使用与数据库的多个连接而不是在线程之间共享一个连接吗?

于 2008-09-17T19:20:23.187 回答
2

实际上,您无法保证线程将以何种顺序执行。所以行为(如果不是你所期望的)并不是真正的错误。

我怀疑您在这里进行了某种同步。可能 SQL*Plus 只让我们自己被调用一次?有些程序会这样做...

其他可能性:

  • 线程创建和进程创建(您正在为 SQL*Plus 创建子进程,不是吗?)比运行线程花费的时间更长,因此线程 1 甚至在线程 2 开始之前就完成了

  • 您正在 SQL 脚本中使用强制同步数据库更新的事务。

于 2008-09-17T18:45:16.640 回答
1

检查您的数据库设置。您可能会发现它是以保守的方式设置的。这将导致即使是很小的读取也会阻止对该信息的所有访问。

您可能还需要调用threads::yield.

于 2008-09-18T04:02:25.617 回答