2014-06-18 70 views
0

我在Python中有一個類函數。 我跑在許多不同的情況下當thread.sleep影響其他類對象的類對象 - 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() 
+0

這不是有效的Python代碼。請提供[最小工作示例](http://stackoverflow.com/help/mcve)。 – jonrsharpe

+0

@jonrsharpe更新謝謝! – user3744102

+0

您能否檢查縮進 - 仍然不會按原樣運行 – jonrsharpe

回答

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秒時密切同步(取決於計算機可能打印在同一行上的確切時間)。

請注意,我們正在調用從Thread類繼承的start方法,而不是我們上面定義的運行方法。線程代碼將在產生的線程中爲我們調用run

通過使用multiprocessing.Process作爲基類而不是threading.Thread,可以獲得等效的多處理版本。唯一的區別是你會產生子進程而不是子線程。對於Python中CPU限制的工作,進程比線程更好,因爲它們不受全局解釋器鎖定的限制,這使得兩個線程不可能同時運行Python代碼。缺點是啓動時和進程間通信時開銷較高。

1

可用於運行並行任務芹菜。這很容易實現。

看到一個例子:

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