我正在尝试开发一种具有多线程功能的软件。 在Linux上,脚本运行正常,我使用的模块是''forks''。 换句话说,在查询db和类似的东西时,线程之间没有共享处理程序的问题。 一旦我试图在Windows上运行脚本(Strawberry Perl),当我尝试cpan安装分叉时,它说当前版本的操作系统(64位)不支持''forks module''。 移过来,我决定使用''threads'',但我得到了以下错误,几乎肯定与线程之间的共享处理程序相关联。
'' 线程1异常终止:DBD :: SQLite :: db准备失败:句柄2由线程d97fe8拥有而不是当前线程3a01058(句柄不能在线程之间共享,驱动程序可能需要添加CLONE方法)在file.pl行180,第1行。 ''
如何修复上述问题并使脚本在Windows Strawberry Perl上运行?
答案 0 :(得分:3)
一般each thread or process needs to have its own handle to the database。在每个fork
之后或每个threads::create
内创建一个新句柄。
答案 1 :(得分:0)
首先,感谢大家的快速回答和非常好的建议。 这是我的解决方案。 显然,似乎没有必要为每个线程创建一个新的数据库处理程序,只需在每次创建新线程时连接到数据库。 因此,如果您正在使用''线程',我认为应该足以在''线程中包含以下行 - > ;创建''让它可以运行的方法:
$dbh = DBI->connect( "dbi:SQLite:db_name.dbl" ) || die "Cannot connect: $DBI::errstr";
正如您所看到的,处理程序是静态的,但它不是字面上的共享''之间 线程,因为它是在每次连接到db时创建的,所以每次运行新线程时都会创建!
请不要问我为什么原始脚本在Linux中使用'' forks''''''并且没有这个伎俩...似乎用''''''你不需要关心共享处理程序。
再次感谢