在Perl中,不使用Thread
库,产生系统调用的最简单方法是什么,以便它是非阻塞的?您是否可以在避免fork()
的同时执行此操作?
EDIT 澄清。我想避免对fork进行明确而混乱的调用。
答案 0 :(得分:10)
你的意思是这样吗?
system('my_command_which_will_not_block &');
正如Chris Kloberdanz指出的那样,这将隐式调用fork() - perl实际上没有其他办法可以做到这一点;特别是如果你希望perl解释器在命令执行时继续运行。
命令中的&
字符是一个shell元字符 - perl看到这个并将参数传递给shell(通常是bash)以便执行,而不是直接运行它system()
来电。 execv()
告诉bash再次fork,在后台运行命令,然后立即退出,在命令继续执行时将控制权返回给perl。
答案 1 :(得分:4)
上面的帖子说“perl没有其他方法可以做到这一点”,但事实并非如此。
由于您提到了文件删除,请查看IO::AIO。这在另一个线程(POSIX线程,而不是Perl伪线程)中执行系统调用;您使用aio_rmtree
安排请求,完成后,模块将调用程序中的函数。与此同时,您的程序可以执行其他任何操作。
在另一个POSIX线程中执行操作实际上是一种非常有用的技术。 (一个特殊的黑客版本)Coro使用它来抢占协同程序(时间切片),EV :: Loop :: Async使用它来传递事件通知,即使Perl正在做一些事情而不是等待事件。