更新后的代码如下:
- 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
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|