python中threading和queue库实现多线程编程


Posted in Python onFebruary 06, 2021

摘要

本文主要介绍了利用python的 threading和queue库实现多线程编程,并封装为一个类,方便读者嵌入自己的业务逻辑。最后以机器学习的一个超参数选择为例进行演示。

多线程实现逻辑封装

实例化该类后,在.object_func函数中加入自己的业务逻辑,再调用.run方法即可。

# -*- coding: utf-8 -*-
# @Time : 2021/2/4 14:36
# @Author : CyrusMay WJ
# @FileName: run.py
# @Software: PyCharm
# @Blog :https://blog.csdn.net/Cyrus_May
import queue
import threading

class CyrusThread(object):
  def __init__(self,num_thread = 10,logger=None):
    """
    
    :param num_thread: 线程数
    :param logger: 日志对象
    """
    self.num_thread = num_thread
    self.logger = logger

  def object_func(self,args_queue,max_q):
    while 1:
      try:
        arg = args_queue.get_nowait()
        step = args_queue.qsize()
        self.logger.info("progress:{}\{}".format(max_q,step))
      except:
        self.logger.info("no more arg for args_queue!")
        break
        
        
        """
        此处加入自己的业务逻辑代码
        """
        
        
  def run(self,args):
    args_queue = queue.Queue()
    for value in args:
      args_queue.put(value)
    threads = []
    for i in range(self.num_thread):
      threads.append(threading.Thread(target=self.object_func,args = args_queue))
    for t in threads:
      t.start()
    for t in threads:
      t.join()

模型参数选择实例

# -*- coding: utf-8 -*-
# @Time : 2021/2/4 14:36
# @Author : CyrusMay WJ
# @FileName: run.py
# @Software: PyCharm
# @Blog :https://blog.csdn.net/Cyrus_May
import queue
import threading
import numpy as np
from sklearn.datasets import load_boston
from sklearn.svm import SVR
import logging
import sys


class CyrusThread(object):
  def __init__(self,num_thread = 10,logger=None):
    """

    :param num_thread: 线程数
    :param logger: 日志对象
    """
    self.num_thread = num_thread
    self.logger = logger

  def object_func(self,args_queue,max_q):
    while 1:
      try:
        arg = args_queue.get_nowait()
        step = args_queue.qsize()
        self.logger.info("progress:{}\{}".format(max_q,max_q-step))
      except:
        self.logger.info("no more arg for args_queue!")
        break
      # 业务代码
      C, epsilon, gamma = arg[0], arg[1], arg[2]
      svr_model = SVR(C=C, epsilon=epsilon, gamma=gamma)
      x, y = load_boston()["data"], load_boston()["target"]
      svr_model.fit(x, y)
      self.logger.info("score:{}".format(svr_model.score(x,y)))


  def run(self,args):
    args_queue = queue.Queue()
    max_q = 0
    for value in args:
      args_queue.put(value)
      max_q += 1
    threads = []
    for i in range(self.num_thread):
      threads.append(threading.Thread(target=self.object_func,args = (args_queue,max_q)))
    for t in threads:
      t.start()
    for t in threads:
      t.join()

# 创建日志对象
logger = logging.getLogger()
logger.setLevel(logging.INFO)
screen_handler = logging.StreamHandler(sys.stdout)
screen_handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(module)s.%(funcName)s:%(lineno)d - %(levelname)s - %(message)s')
screen_handler.setFormatter(formatter)
logger.addHandler(screen_handler)

# 创建需要调整参数的集合
args = []
for C in [i for i in np.arange(0.01,1,0.01)]:
  for epsilon in [i for i in np.arange(0.001,1,0.01)] + [i for i in range(1,10,1)]:
    for gamma in [i for i in np.arange(0.001,1,0.01)] + [i for i in range(1,10,1)]:
      args.append([C,epsilon,gamma])

# 创建多线程工具
threading_tool = CyrusThread(num_thread=20,logger=logger)
threading_tool.run(args)

运行结果

2021-02-04 20:52:22,824 - run.object_func:31 - INFO - progress:1176219\1
2021-02-04 20:52:22,824 - run.object_func:31 - INFO - progress:1176219\2
2021-02-04 20:52:22,826 - run.object_func:31 - INFO - progress:1176219\3
2021-02-04 20:52:22,833 - run.object_func:31 - INFO - progress:1176219\4
2021-02-04 20:52:22,837 - run.object_func:31 - INFO - progress:1176219\5
2021-02-04 20:52:22,838 - run.object_func:31 - INFO - progress:1176219\6
2021-02-04 20:52:22,841 - run.object_func:31 - INFO - progress:1176219\7
2021-02-04 20:52:22,862 - run.object_func:31 - INFO - progress:1176219\8
2021-02-04 20:52:22,873 - run.object_func:31 - INFO - progress:1176219\9
2021-02-04 20:52:22,884 - run.object_func:31 - INFO - progress:1176219\10
2021-02-04 20:52:22,885 - run.object_func:31 - INFO - progress:1176219\11
2021-02-04 20:52:22,897 - run.object_func:31 - INFO - progress:1176219\12
2021-02-04 20:52:22,900 - run.object_func:31 - INFO - progress:1176219\13
2021-02-04 20:52:22,904 - run.object_func:31 - INFO - progress:1176219\14
2021-02-04 20:52:22,912 - run.object_func:31 - INFO - progress:1176219\15
2021-02-04 20:52:22,920 - run.object_func:31 - INFO - progress:1176219\16
2021-02-04 20:52:22,920 - run.object_func:39 - INFO - score:-0.01674283914287855
2021-02-04 20:52:22,929 - run.object_func:31 - INFO - progress:1176219\17
2021-02-04 20:52:22,932 - run.object_func:39 - INFO - score:-0.007992354170952565
2021-02-04 20:52:22,932 - run.object_func:31 - INFO - progress:1176219\18
2021-02-04 20:52:22,945 - run.object_func:31 - INFO - progress:1176219\19
2021-02-04 20:52:22,954 - run.object_func:31 - INFO - progress:1176219\20
2021-02-04 20:52:22,978 - run.object_func:31 - INFO - progress:1176219\21
2021-02-04 20:52:22,984 - run.object_func:39 - INFO - score:-0.018769934807246536
2021-02-04 20:52:22,985 - run.object_func:31 - INFO - progress:1176219\22

到此这篇关于python中threading和queue库实现多线程编程的文章就介绍到这了,更多相关python 多线程编程内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python进阶教程之文本文件的读取和写入
Aug 29 Python
Python找出9个连续的空闲端口
Feb 01 Python
python 类详解及简单实例
Mar 24 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 Python
在vscode中配置python环境过程解析
Sep 28 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
Oct 09 Python
用python解压分析jar包实例
Jan 16 Python
在python中logger setlevel没有生效的解决
Feb 21 Python
python数字类型math库原理解析
Mar 02 Python
Python语法垃圾回收机制原理解析
Mar 25 Python
python实现单机五子棋
Aug 28 Python
Python使用openpyxl模块处理Excel文件
Jun 05 Python
Python3爬虫ChromeDriver的安装实例
Feb 06 #Python
解决pycharm修改代码后第一次运行不生效的问题
Feb 06 #Python
Python tkinter之ComboBox(下拉框)的使用简介
Feb 05 #Python
python批量提取图片信息并保存的实现
Feb 05 #Python
Python的轻量级ORM框架peewee使用教程
Feb 05 #Python
pycharm 实现光标快速移动到括号外或行尾的操作
Feb 05 #Python
pycharm进入时每次都是insert模式的解决方式
Feb 05 #Python
You might like
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
PHP生成Gif图片验证码
2013/10/27 PHP
php使用google地图应用实例
2014/12/31 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
php获取excel文件数据
2017/04/21 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
jquery 学习之二 属性相关
2010/11/23 Javascript
jQuery Tools tooltip使用说明
2012/07/14 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
JQuery的ready函数与JS的onload的区别详解
2013/11/21 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
Javascript基础回顾之(一) 类型
2017/01/31 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
介绍Python的@property装饰器的用法
2015/04/28 Python
Python使用gensim计算文档相似性
2016/04/10 Python
Python全排列操作实例分析
2018/07/24 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
Python实现随机取一个矩阵数组的某几行
2019/11/26 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
python识别验证码的思路及解决方案
2020/09/13 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
总账会计岗位职责
2014/03/13 职场文书
庆元旦主持词
2015/07/06 职场文书
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server
MySQL时区造成时差问题
2022/04/13 MySQL