1.对python虚拟机的访问由全局解释器锁来控制,正是这个锁能保证同一时刻只有一个线程在运行。
import threading
loops = [4,2];
def loop(nloop, nsec):
print 'start loop', nloop, 'at:', ctime();
sleep(nsec);
print 'loop', nloop, 'done at:', ctime();
def main():
print 'starting at:', ctime();
threads = [];
nloops = range(len(loops));
for i in nloops:
t = threading.Thread(target=loop, args=(i, loops[i]));
threads.append(t);
for i in nloops:
threads[i].start();
for i in nloops:
threads[i].join(); #join() wait the thread over.
print 'all NONE at:', ctime();
if __name__ == '__main__':
main();
创建一个Thread的实例,传给它一个可调用的类对象。
loops = [4,2];
class ThreadFunc(object):
def __init__(self, func, args, name=''):
self.name = name;
self.func = func;
self.args = args;
def __call__(self):
apply(self.func, self.args);
def loop(nloop, nsec):
print 'start loop', nloop, 'at:', ctime();
sleep(nsec);
print 'loop', nloop, 'done at:', ctime();
def main():
print 'starting at:', ctime();
threads = [];
nloops = range(len(loops));
for i in nloops:
t = threading.Thread(target=ThreadFunc(loop, (i, loops[i]), loop.__name__));
threads.append(t);
for i in nloops:
threads[i].start();
for i in nloops:
threads[i].join(); #join() wait the thread over.
print 'all NONE at:', ctime();
if __name__ == '__main__':
main();
创建新线程的时候,Thread对象会调用ThreadFunc对象,这时会用到一个特殊函数__call__()。
从Thread派生出一个子类,创建一个这个子类的实例。
loops = (4,2);
class MyThread(threading.Thread):
def __init__(self, func, args, name=''):
threading.Thread.__init__(self);
self.name = name;
self.func = func;
self.args = args;
def run(self):
apply(self.func, self.args);
def loop(nloop, nsec):
print 'start loop', nloop, 'at:', ctime();
sleep(nsec);
print 'loop', nloop, 'done at:', ctime();
def main():
print 'starting at:', ctime();
threads = [];
nloops = range(len(loops));
for i in nloops:
t = MyThread(loop, (i, loops[i]), loop.__name__);
threads.append(t);
for i in nloops:
threads[i].start();
for i in nloops:
threads[i].join(); #join() wait the thread over.
print 'all NONE at:', ctime();
if __name__ == '__main__':
main();