代码之家  ›  专栏  ›  技术社区  ›  jahmax

如何在python或ruby中执行此操作(php)?

  •  1
  • jahmax  · 技术社区  · 14 年前

    我的应用程序获取一个looong URL列表,并将其拆分为x(其中x=$threads),这样我就可以启动一个thread.php并计算它的URL。然后它会获取并发布检索数据的请求

    我用这个:

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

    对于“线程”(我知道它不是真正的线程,是分叉还是什么?),我将pids保存到一个文件中,以便稍后检查n线程是否正在运行并停止它们。

    现在我想离开PHP,我考虑使用Python,因为我想了解更多关于它的信息。

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

    或者,是否有更好的方法来启动并行运行的Python或Ruby中的多个后台线程(同时)?

    线程不需要彼此通信或与主线程通信,它们是独立的,它们执行HTTP请求并与MySQLdb交互,它们可能需要访问/修改相同的表条目(我还不知道这一点或我将如何解决它)。

    该应用程序与“项目”一起工作,每个项目都有一个“max threads”变量,我使用一个Web界面来控制它(所以我仍然可以在新应用程序中使用php作为接口[启动/停止线程])。

    我想用

    from threading import Thread
    

    在Python中,但我听说这些线程不会并行运行,而是一次运行一次。

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

    任何建议将不胜感激。

    2 回复  |  直到 14 年前
        1
  •  1
  •   ars    14 年前

    对于python 2.6+,请考虑 multiprocessing 模块:

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

    对于python 2.5,可以通过 pyprocessing .

    除了上面链接处的示例外,下面还有一些其他链接可供您开始使用:

        2
  •  1
  •   Charles    14 年前

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

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

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

    如果同时向队列中插入五个作业,并且恰好有五个工人在等待,则每个工人都将得到其中一个作业。如果有比工人更多的工作,这些工作将按顺序处理。您的客户机(提交作业的东西)可以等待它创建的所有作业完成,也可以简单地将它们放在队列中并继续执行。