我有一个Perl脚本,我正在尝试使用Perl Threads设置(使用线程)。当我运行简单测试时,一切正常,但是当我执行我的实际脚本(其中线程运行多个SQL Plus会话)时,每个SQL Plus会话按顺序运行(即,线程1的sqlplus运行步骤1 -5,然后线程2的sqlplus运行步骤6-11等。)。
我以为我理解线程会进行并发处理,但有些不对劲。任何想法,还是我应该做其他Perl魔术?
答案 0 :(得分:4)
一些可能的解释:
您是在多核处理器还是多处理器计算机上运行此脚本?如果您只有一个CPU,则只有一个线程可以随时使用它。
步骤1-6是否涉及会阻止同时执行的事务或锁定?
您确定要使用多个数据库连接而不是在线程之间共享一个连接吗?
答案 1 :(得分:2)
实际上,您无法保证线程执行的顺序。所以这种行为(如果不是你所期望的那样)并没有真正错误。
我怀疑你在这里有某种同步。可能SQL * Plus只能让它自己被调用一次?有些程序会这样做......
其他可能性:
创建线程和创建进程(是为SQL * Plus创建子进程,不是吗?)比运行线程花费的时间更长,因此线程1在线程2之前完成开始
您正在SQL脚本中使用强制同步数据库更新的事务。
答案 2 :(得分:1)
检查数据库设置。您可能会发现它以保守的方式设置。这甚至会导致次要读取阻止对该信息的所有访问。
您可能还需要致电threads::yield
。