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脚本
Apr 05 Python
零基础写python爬虫之HTTP异常处理
Nov 05 Python
一步步解析Python斗牛游戏的概率
Feb 12 Python
Python数据类型详解(二)列表
May 08 Python
不要用强制方法杀掉python线程
Feb 26 Python
对Python3之进程池与回调函数的实例详解
Jan 22 Python
通过PYTHON来实现图像分割详解
Jun 26 Python
python实现按行分割文件
Jul 22 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
Apr 26 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
next在python中返回迭代器的实例方法
Dec 15 Python
python中的被动信息搜集
Apr 29 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
php mysql数据库操作类
2008/06/04 PHP
ajax取消挂起请求的处理方法
2013/03/18 PHP
CodeIgniter自定义控制器MY_Controller用法分析
2016/01/20 PHP
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
2013/01/24 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
JavaScript函数详解
2014/11/17 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
FullCalendar日历插件应用之数据展现(一)
2015/12/23 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
2016/11/09 Javascript
JavaScript仿微博发布信息案例
2016/11/16 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
JS实现带阴历的日历功能详解
2019/01/24 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
2019/04/14 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
vue项目强制清除页面缓存的例子
2019/11/06 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
github配置使用指南
2014/11/18 Python
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
使用python编写udp协议的ping程序方法
2018/04/22 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
2019/07/22 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
澳大利亚相机之家:Camera House
2017/11/30 全球购物
BAILEY 44官网:美国制造的女性服装
2019/07/01 全球购物
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
小学校园广播稿(3篇)
2014/09/19 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书