之前,此問題是由以下問題跟進:With statement and python threading
我一直在使用Python線程API試驗。 我有這樣的代碼,它適用於我想要實現的功能:---->在調用python線程運行之前執行函數執行。但是要做到這一點,我總是不得不在run()方法中調用time.sleep(1)以使其繼續執行(),否則線程將退出而不進行函數分配和執行。是否有更好的方法實現這種等待?隨着句和線程:讓函數執行運行
from __future__ import print_function
import threading
import time
import functools
import contextlib
import thread
from threading import Lock
#import contextlib
#Thread module for dealing with lower level thread operations.Thread is limited use Threading instead.
def timeit(fn):
'''Timeit function like this doesnot work with the thread calls'''
def wrapper(*args,**kwargs):
start = time.time()
fn(*args,**kwargs)
end = time.time()
threadID = ""
print ("Duration for func %s :%d\n"%(fn.__name__ +"_"+ threading.current_thread().name ,end-start))
return wrapper
exitFlag = 0
@timeit
def print_time(counter,delay):
while counter:
if exitFlag:
thread.exit()
time.sleep(delay)
print("%s : %s_%d"%(threading.current_thread().name,time.ctime(time.time()),counter))
counter -= 1
class Mythread(threading.Thread):
def __init__(self,threadID,name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self._f = None
def run(self):
print("Starting%s\n" % self.name)
time.sleep(1)
if self._f:
self._f()
print("Exiting%s\n" % self.name)
else:
print("Exiting%s without function execution\n" % self.name)
# def set_f(self,f):
# self._f = f
def execute(self,f,*args,**kwargs):
self._f=functools.partial(f,*args,**kwargs)
def __enter__(self):
self.start()
def __exit__(self,type,value,traceback):
self.join()
class ThreadContainer(object):
def __init__(self,id,name):
self._t = Mythread(id,name)
def execute(self,f,*args,**kwargs):
self._f=functools.partial(f,*args,**kwargs)
self._t.set_f(self._f)
# self._t.start()
# self._t.join()
def __enter__(self):
self._t.start()
def __exit__(self,type,value,traceback):
self._t.join()
if __name__ == '__main__':
'''
print_time(5, 1)
threadLock = threading.Lock()
threads = []
thread1 = Mythread(1,"Thread1",5,1)
thread2 = Mythread(2,"Thread2",5,2)
thread1.start()
thread2.start()
threads.append(thread1)
threads.append(thread2)
for t in threads:
t.join()
'''
# thread1 = Mythread(1,"Thread1")
# thread2 = Mythread(2,"Thread2")
# with contextlib.nested(ThreadContainer(1,"Thread1"),ThreadContainer(2,"Thread2")) as (t1,t2):
# t1.execute(print_time,5,1)
# t2.execute(print_time,5,2)
t1 = Mythread(1,"Thread1")
t2 = Mythread(2,"Thread2")
with contextlib.nested(t1,t2):
t1.execute(print_time,5,1)
t2.execute(print_time,5,2)
print("Exiting main thread ")
如果你剝離它們,你的問題會更容易回答 - 刪除註釋掉的代碼,你永遠不會實例化的類,等等,如果它們與這個問題無關,並且提供一個最小的例子來展示你所問的東西(理想的情況是一個不需要滾動讀取)。 – abarnert 2013-05-07 18:02:19