Python核心编程 第18章 多线程

本文详细介绍了Python中多线程的实现机制,通过使用threading模块创建线程,并展示了如何利用Thread类和ThreadFunc类进行线程的定义与执行。文章还涉及了线程之间的同步与协调,以及如何在主线程中等待所有子线程完成。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值