2010-07-20 109 views
1

我的应用程序需要一个loooong的URL列表,并将其拆分为X(其中X = $ threads),然后我可以启动一个thread.php并为其计算url。然后它GET和POST请求来检索我使用这个数据如何在python或ruby中执行此操作(PHP)?

for($x=1;$x<=$threads;$x++){ 
    $pid[] = exec("/path/bin/php thread.php <options> > /dev/null & echo \$!"); 
} 

对于“线程”(?我知道它不是真正的线程,则它分叉还是什么),我保存的PID写入一个文件以供稍后检查N线程是否正在运行并停止它们。

现在我想从PHP迁出,我正在考虑使用python,因为我想了解更多信息。

我该如何用python实现这种“线程化”?(或红宝石)

还是有更好的方式来推出的,在并行运行Python或Ruby多个后台线程(在同一时间)?

螺纹不需要彼此之间或与主线程,它们是独立的,但它们确实http请求,并用MySQL数据库进行交互通信,他们可能需要访问/修改相同的表项(我没有想过这个或我将如何解决它)。

该应用程序适用于“项​​目”,每个项目都有一个“最大线程”变量,我使用一个web界面来控制它(所以我仍然可以在新应用程序中使用php进行接口[启动/停止线程] )。

我想在Python中使用

from threading import Thread 

,但我已经告诉这些线程惯于并行运行,但一旦在一段时间。

该应用程序旨在运行在Linux Web服务器上。

任何建议将不胜感激。

回答

1

对于Python 2。6+,请考虑multiprocessing模块:

multiprocessing是一个程序包,它支持使用类似于线程模块的API的产卵进程。多处理包提供本地和远程并发,通过使用子进程而不是线程有效地侧移全局解释器锁。由于这个原因,多处理模块允许程序员充分利用给定机器上的多个处理器。它可以在Unix和Windows上运行

对于Python 2.5,通过pyprocessing可以使用相同的功能。

除了在例如上面的联系,这里有一些额外的链接,让你开始:

+0

看起来它会完成这项工作,稍后会详细阅读它,谢谢。 – jahmax 2010-07-21 04:54:59

1

你不想穿线。你想a work queue like Gearman,你可以发送作业异步。

值得注意的是,这是一个跨平台的跨语言解决方案。有bindings for many languages (including Python and PHP)正式提供,更多非官方与谷歌工作。

最初的意图是有效的负载平衡,但它只适用于一台机器。基本上,您可以创建一个或多个监听作业的工人。您可以控制工作人员数量和他们可以监听的作业类型。

如果您同时向队列中插入五个作业,并且碰巧有五个工人等待,则每个工人都将被交给其中一个作业。如果有比工作人员多的作业,则按顺序处理作业。您的客户端(提交作业的东西)可以等待所创建的所有作业完成,也可以将它们放入队列中并继续。

+0

将检查它,谢谢。 – jahmax 2010-07-20 22:44:59

+0

但是,不是为了在“多台计算机”之间分配任务而构建的吗?如果我只使用一台电脑,它会给我的应用带来哪些好处? – jahmax 2010-07-20 22:57:54

+0

我已经更新了我的答案以澄清。 – Charles 2010-07-21 00:01:41