2016-07-25 5 views
1

ランダムな整数を生成する2つの関数があり、与えられた間隔でスリープします。しかし、私はtime.sleep()がPythonプログラム全体を一時停止している間、これらの2つの機能を独立して眠りたいです。Python:関数全体を一時停止するのではなく、

def fun1(): 
interval1 = random.randint(2,800) 
time.sleep(interval1) 
# do other things 

def fun2(): 
interval2 = random.randint(1, 999) 
time.sleep(interval2) 
# do other things, different than in fun2 

私はfun1が一時停止されたときに、fun2はまだ限り呼ばれませんtime.sleep(interval2)として自分のことをやっているような、特定の機能を眠ることができる方法は?

+0

'fun1()'または 'fun2()'は値を返す必要がありますか? – Will

+0

あなたはマルチスレッドまたは非同期プログラミングのどちらかを求めているようです。 Python asyncio(Python 3.4+)を見てください。 – deceze

+0

Python 2またはPython 3? – Will

答えて

1

は、単純に次のようにします:

from threading import Thread 
thread1 = Thread(target=fun1) 
thread2 = Thread(target=fun2) 
thread1.start() 
thread2.start() 

これは、それぞれfun1fun2を呼び出して、メインスレッドの独立した2つのスレッドを開始します。

例:

from threading import Thread 
import random 
import time 

starttime = time.time() 

def fun1(): 
    interval1 = random.randint(1,5) 
    time.sleep(interval1) 
    print "%d sec: Fun1" % (time.time() - starttime) 

def fun2(): 
    interval2 = random.randint(1,5) 
    time.sleep(interval2) 
    print "%d sec: Fun2" % (time.time() - starttime) 

thread1 = Thread(target=fun1) 
thread2 = Thread(target=fun2) 
thread1.start() 
thread2.start() 

print "Still doing things!" 

出力:

Still doing things! 
2 sec: Fun2 
4 sec: Fun1 

あなたが見ることができるように、関数が走ったが、コードはまだスレッド後にprint文を実行し続けています。

+0

スレッドは、Pythonでは役に立たないかもしれません:( – Will

+1

@Will彼らはこの場合でも仕事をしますが、そうではありませんか? – Jokab

+0

彼の仕事量によって決まります。 'プロセスを必要とするかもしれない部分:)とにかくupvoted;私は 'マルチプロセッシング'について答えました。確かに、同意した。 – Will

1

これを試してみてください:

from multiprocessing import Process 

def fun1(): 
    interval1 = random.randint(2,800) 
    time.sleep(interval1) 
    # do other things 

def fun2(): 
    interval2 = random.randint(1, 999) 
    time.sleep(interval2) 
    # do other things 

proc1 = Process(target=fun1) 
proc2 = Process(target=fun2) 
proc1.start() 
proc2.start() 
proc1.join() 
proc2.join() 

これは、並列にfun1()fun2()を実行するためにmultiprocessingを使用して、新しいPythonのプロセスを開始します。 join()コールは、proc1proc2が完了するまで、メイン(親)プロセスでブロックされます。

Global Interpreter Lockのため、threadingモジュールはパフォーマンスに大きな影響を与えません。しかし、あなたの機能がほとんど待っているだけなら、Threadが適切かもしれません。

関連する問題