设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 创业者
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

一篇文章读懂 Python 多线程(2)

发布时间:2019-09-24 15:38 所属栏目:21 来源:编程派
导读:更新后的代码如下: importlogging importthreading classMyThread(threading.Thread): def__init__(self,number,logger): threading.Thread.__init__(self) self.number=number self.logger=logger defrun(self):

更新后的代码如下:

  1. import logging 
  2. import threading 
  3.  
  4. class MyThread(threading.Thread): 
  5. def __init__(self, number, logger): 
  6. threading.Thread.__init__(self) 
  7. self.number = number 
  8. self.logger = logger 
  9.  
  10. def run(self): 
  11. """ 
  12. 运行线程 
  13. """ 
  14. logger.debug('Calling doubler') 
  15. doubler(self.number, self.logger) 
  16.  
  17. def get_logger: 
  18. logger = logging.getLogger("threading_example") 
  19. logger.setLevel(logging.DEBUG) 
  20.  
  21. fh = logging.FileHandler("threading_class.log") 
  22. fmt = '%(asctime)s - %(threadName)s - %(levelname)s - %(message)s' 
  23. formatter = logging.Formatter(fmt) 
  24. fh.setFormatter(formatter) 
  25.  
  26. logger.addHandler(fh) 
  27. return logger 
  28.  
  29. def doubler(number, logger): 
  30. """ 
  31. 可以被线程使用的一个函数 
  32. """ 
  33. logger.debug('doubler function executing') 
  34. result = number * 2 
  35. logger.debug('doubler function ended with: {}'.format( 
  36. result)) 
  37.  
  38. if __name__ == '__main__': 
  39. logger = get_logger 
  40. thread_names = ['Mike', 'George', 'Wanda', 'Dingbat', 'Nina'] 
  41. for i in range(5): 
  42. thread = MyThread(i, logger) 
  43. thread.setName(thread_names[i]) 
  44. thread.start 

这个例子中,我们只是创建一个继承于 threading.Thread的子类。像之前一样,传入一个需要翻一番的数字,以及 logging 对象。但是这次,设置线程名称的方式有点不太一样,变成了通过调用 thread 对象的setName方法来设置。不过仍然需要调用start来启动线程,不过你可能注意到我们并不需要在子类中定义该方法。当调用start时,它会通过调用run方法来启动线程。在我们的类中,我们调用 doubler 函数来做处理。输出结果中除了一些添加的额外信息内容几乎差不多。运行下这个脚本,看看你会得到什么。

线程锁与线程同步

当你有多个线程,就需要考虑怎样避免线程冲突。我的意思是说,你可能遇到多个线程同时访问同一资源的情况。如果不考虑这些问题并且制定相应的解决方案,那么在开发产品过程中,你总会在最糟糕的时候遇到这些棘手的问题。

解决办法就是使用线程锁。锁由 Python 的 threading 模块提供,并且它最多被一个线程所持有。当一个线程试图获取一个已经锁在资源上的锁时,该线程通常会暂停运行,直到这个锁被释放。来让我们看一个非常典型没有却应具备锁功能的例子:

  1. import threading 
  2.  
  3. total = 0 
  4.  
  5. def update_total(amount): 
  6. """ 
  7. Updates the total by the given amount 
  8. """ 
  9. global total 
  10. total += amount 
  11. print (total) 
  12. if __name__ == '__main__': 
  13. for i in range(10): 
  14. my_thread = threading.Thread( 
  15. target=update_total, args=(5,)) 
  16. my_thread.start 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读