我可以让Windows中的Perl ithread并发运行吗?

时间:2020-03-05 18:59:38  来源:igfitidea点击:

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

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

解决方案

回答

实际上,我们无法保证线程执行的顺序。因此,行为(如果不是我们期望的那样)并不是真的错误。

我怀疑我们在这里正在进行某种同步。可能SQL * Plus仅让我们自己被调用一次?一些程序可以做到这一点...

其他可能性:

  • 线程创建和进程创建(我们正在为SQL * Plus创建子进程,不是吗?)花费的时间比运行线程长,因此线程1在线程2甚至开始之前就已完成
  • 我们正在使用SQL脚本中的事务来强制同步数据库更新。

回答

一些可能的解释:

  • 我们是否在多核处理器或者多处理器计算机上运行此脚本?如果只有一个CPU,则任何时候都只能使用一个线程。
  • 步骤1-6是否包含事务或者锁,这些事务或者锁会阻止它同时完成?
  • 我们确定我们正在使用与数据库的多个连接,而不是在线程之间共享一个连接吗?

回答

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

我们可能还需要调用threads :: yield