| 
                         更新后的代码如下: 
- import logging 
 - import threading 
 -  
 - class MyThread(threading.Thread): 
 - def __init__(self, number, logger): 
 - threading.Thread.__init__(self) 
 - self.number = number 
 - self.logger = logger 
 -  
 - def run(self): 
 - """ 
 - 运行线程 
 - """ 
 - logger.debug('Calling doubler') 
 - doubler(self.number, self.logger) 
 -  
 - def get_logger: 
 - logger = logging.getLogger("threading_example") 
 - logger.setLevel(logging.DEBUG) 
 -  
 - fh = logging.FileHandler("threading_class.log") 
 - fmt = '%(asctime)s - %(threadName)s - %(levelname)s - %(message)s' 
 - formatter = logging.Formatter(fmt) 
 - fh.setFormatter(formatter) 
 -  
 - logger.addHandler(fh) 
 - return logger 
 -  
 - def doubler(number, logger): 
 - """ 
 - 可以被线程使用的一个函数 
 - """ 
 - logger.debug('doubler function executing') 
 - result = number * 2 
 - logger.debug('doubler function ended with: {}'.format( 
 - result)) 
 -  
 - if __name__ == '__main__': 
 - logger = get_logger 
 - thread_names = ['Mike', 'George', 'Wanda', 'Dingbat', 'Nina'] 
 - for i in range(5): 
 - thread = MyThread(i, logger) 
 - thread.setName(thread_names[i]) 
 - thread.start 
 
  
这个例子中,我们只是创建一个继承于 threading.Thread的子类。像之前一样,传入一个需要翻一番的数字,以及 logging  对象。但是这次,设置线程名称的方式有点不太一样,变成了通过调用 thread  对象的setName方法来设置。不过仍然需要调用start来启动线程,不过你可能注意到我们并不需要在子类中定义该方法。当调用start时,它会通过调用run方法来启动线程。在我们的类中,我们调用  doubler 函数来做处理。输出结果中除了一些添加的额外信息内容几乎差不多。运行下这个脚本,看看你会得到什么。 
线程锁与线程同步 
当你有多个线程,就需要考虑怎样避免线程冲突。我的意思是说,你可能遇到多个线程同时访问同一资源的情况。如果不考虑这些问题并且制定相应的解决方案,那么在开发产品过程中,你总会在最糟糕的时候遇到这些棘手的问题。 
解决办法就是使用线程锁。锁由 Python 的 threading  模块提供,并且它最多被一个线程所持有。当一个线程试图获取一个已经锁在资源上的锁时,该线程通常会暂停运行,直到这个锁被释放。来让我们看一个非常典型没有却应具备锁功能的例子: 
- import threading 
 -  
 - total = 0 
 -  
 - def update_total(amount): 
 - """ 
 - Updates the total by the given amount 
 - """ 
 - global total 
 - total += amount 
 - print (total) 
 - if __name__ == '__main__': 
 - for i in range(10): 
 - my_thread = threading.Thread( 
 - target=update_total, args=(5,)) 
 - my_thread.start 
 
                          (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |