【问题标题】:Perl Multithreading: ''forks'' vs ''threads'' in cross platforms scriptsPerl 多线程:跨平台脚本中的“forks”与“threads”
【发布时间】:2018-03-09 01:48:47
【问题描述】:

我正在尝试开发一种具有多线程功能的软件。 在 Linux 上,脚本运行良好,我使用的模块是“forks”。 换句话说,在查询数据库和类似的东西时,线程之间没有共享处理程序的问题。 一旦我尝试在 Windows(Strawberry Perl)上运行脚本,当我尝试 cpan install forks 时,它说我的操作系统(64 位)的当前版本不支持“forks 模块”。 继续前进,我决定改用“线程”,但我得到了以下错误,几乎可以肯定与线程之间的共享处理程序有关。

'' 线程 1 异常终止:DBD::SQLite::db 准备失败:句柄 2 由线程 d97fe8 拥有,而不是当前线程 3a01058(无法在线程之间共享句柄,您的驱动程序可能需要添加 CLONE 方法)在 file.pl 行180 号线 1 号线。 ''

如何解决上述问题并使脚本在 windows Strawberry Perl 上可运行?

【问题讨论】:

  • 似乎您需要使用fork 而不是线程自己编写数据库的处理,因为forks 模块有效。数据库告诉你,你不能在线程之间共享句柄,所以你需要使用进程来解决这个问题。
  • 你为什么使用 forks 模块,而不是使用内置的fork 编写自己的东西? forks 的文档说,当您已经拥有 threads 但不再需要它们时,它是一个替代品。 But it does not run on Windows, period。没有办法解决这个问题。 threads 只是坏了。您需要使用正确的forking 重新构建您自己的实现。您是如何提出 forks 模块的?我做 Perl 已经 10 多年了,之前我从未听说过它。
  • 这是一个相对较新的东西,由“不鼓励线程”触发。 IMO 没有太多使用它的充分理由。
  • @simbabque,Sobrique——嗯? forks 到底有什么问题?在那里,人们可以使用线程接口,什么是好的和有用的(例如使用池等),但没有实际的、沉重的线程。为什么不?现在,在 Windows 上……那是不同的。

标签: perl


【解决方案1】:

一般each thread or process needs to have its own handle to the database。在每个 fork 之后或在每个 threads::create 内创建一个新句柄。

【讨论】:

    【解决方案2】:

    首先,感谢大家的及时回答和非常好的建议。 这就是我的解决方案。 显然,似乎不需要为每个线程创建一个新的数据库处理程序,每次创建一个新线程时只需连接到数据库。 所以,如果你使用''threads'',我认为在''threads->create''方法中包含以下行就足够了:

    $dbh = DBI->connect( "dbi:SQLite:db_name.dbl" ) || die "Cannot connect: $DBI::errstr";  
    

    如您所见,处理程序是静态的,但并不是字面上“共享”的 线程,因为它是在每次连接到数据库时创建的,所以每次运行新线程时!

    请不要问我为什么原始脚本在 Linux 中使用 ''forks'' 可以正常工作,而没有这个技巧......似乎使用 ''forks'' 你不需要关心共享处理程序.

    再次感谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多