Python核心编程 第18章 多线程

来源:互联网 发布:火锅英雄 知乎 编辑:程序博客网 时间:2024/06/01 08:48

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();     


0 0