当thread.sleep-Python时,影响其他类对象的类对象

时间:2014-06-18 09:25:31

标签: python multithreading

我在python中有一个类函数。 我在许多不同的实例中运行该类

class worker():
    def__init__(x,x)
    def run():


instance1 = worker(x,x)
instance1.run()
instance2 = worker(x,x)
instance2.run()

问题是如果第一个instance1遇到thread.sleep()它会影响另一个instance2。我如何让他们独立。没有多进程就更好了谢谢!

不同的例子:

__author__ = 'user'
import time


class test():
    def __init__(self, message):
        self.message=message
    def run(self):
        while True:
            print self.message
        time.sleep(5)


if __name__ == '__main__':
    test1 = test("PRINT-1")
    test1.run()
    test2 = test("PRINT-2")
    test2.run()

2 个答案:

答案 0 :(得分:1)

您可以使用 Celery 来运行并行任务。它很容易实现。

查看示例:

import time
from celery import task

@task
def make_task():
    time.sleep(5)
    return True

def execute_tasks():
    result = group([make_task.s(), make_task.s()]).apply_async() # Execute tasks
    print result.get() # Print the result

答案 1 :(得分:0)

看起来您已经关注了并行代码的教程。当前test类中的任何内容都不会导致它并行运行,但只需进行一些小的调整,您就可以使用线程或进程执行此操作。

这是一个使该类继承自threading.Thread的版本:

import threading
import time

class TestThreaded(threading.Thread):
    def __init__(self, x, y):
        super().__init__()
        self.x = x
        self.y = y

    def run(self):
        for i in range(self.x):
            time.sleep(self.y)
            print((i+1)*self.y)

你可以像这样使用它:

t0 = TestThreaded(8, 3)
t1 = TestThreaded(6, 4)

t0.start()
t1.start()

t0.join()
t1.join()

此示例中的两个线程将在24秒的时间内计为24。第一个线程将按三分计数,第二个线程将按四分计数。时间将在12秒和24秒紧密同步(取决于您的计算机及其在同一行上打印的确切时间)。

请注意,我们正在调用从start类继承的Thread方法,而不是我们在上面定义的run方法。线程代码将在生成的线程中为我们调用run

您可以使用multiprocessing.Process作为基类而不是threading.Thread来获得等效的多处理版本。唯一的区别是您将生成子进程而不是子线程。对于Python中的CPU限制工作,进程比线程更好,因为它们不受全局解释器锁的限制,这使得两个线程不可能同时运行Python代码。缺点是在启动期间以及在进程之间进行通信时开销较高。