非阻塞python进程或线程

时间:2011-07-13 18:06:33

标签: python

我有一个监听套接字连接的简单应用程序。每当某些数据块进入时,就会使用该数据调用回调处理程序。在该回调中,我想将我的数据发送到另一个进程或线程,因为它可能需要很长时间才能处理。我最初在回调函数中运行代码,但它阻止!!

分拆新任务的正确方法是什么?

3 个答案:

答案 0 :(得分:23)

threading是通常用于基于资源的多线程的线程库。 multiprocessing库是另一个库,但设计更多用于运行密集的并行计算任务;在您的情况下,线程通常是推荐的库。

实施例

import threading, time
def my_threaded_func(arg, arg2):
    print "Running thread! Args:", (arg, arg2)
    time.sleep(10)
    print "Done!"

thread = threading.Thread(target=my_threaded_func, args=("I'ma", "thread"))
thread.start()
print "Spun off thread"

答案 1 :(得分:5)

多处理模块有worker pools。如果您不需要工作池,可以使用Process与主程序并行运行。

答案 2 :(得分:1)

    import threading
    from   time import sleep
    import sys

    # assume function defs ...

    class myThread (threading.Thread):
        def __init__(self, threadID):
            threading.Thread.__init__(self)
            self.threadID = threadID
        def run(self):
            if self.threadID == "run_exe":
                run_exe()

    def main():
        itemList = getItems()

        for item in itemList:
            thread = myThread("run_exe")
            thread.start()
            sleep(.1)
            listenToSocket(item)
            while (thread.isAlive()):
                pass # a way to wait for thread to finish before looping
    main()
    sys.exit(0)

thread.start()和listenToSocket(item)之间的休眠可确保在开始侦听之前建立线程。我在单元测试框架中实现了这个代码我必须启动多个非黑化进程(len(itemList)次数),因为我的其他测试框架(listenToSocket(item))依赖于进程。

un_exe()可以触发一个可以阻塞的子进程调用(即调用pipe.communicate()),这样执行的输出数据仍然会在python脚本输出的时候打印出来。但是线程的本质使得这很好。

所以这段代码解决了两个问题 - 在不阻止脚本执行的情况下打印子进程数据并按顺序动态创建和启动多个线程(如果我以后再向itemList添加更多项目,则可以更好地维护脚本。)