广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python实现简单多线程任务队列
  • 603
分享到

Python实现简单多线程任务队列

队列多线程简单 2022-06-04 19:06:26 603人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

最近我在用梯度下降算法绘制神经网络的数据时,遇到了一些算法性能的问题。梯度下降算法的代码如下(伪代码): def gradient_descent(): # the gradient descent

最近我在用梯度下降算法绘制神经网络的数据时,遇到了一些算法性能的问题。梯度下降算法的代码如下(伪代码):


def gradient_descent():
  # the gradient descent code
  plotly.write(X, Y)

一般来说,当网络请求 plot.ly 绘图时会阻塞等待返回,于是也会影响到其他的梯度下降函数的执行速度。

一种解决办法是每调用一次 plotly.write 函数就开启一个新的线程,但是这种方法感觉不是很好。 我不想用一个像 cerely(一种分布式任务队列)一样大而全的任务队列框架,因为框架对于我的这点需求来说太重了,并且我的绘图也并不需要 Redis 来持久化数据。

那用什么办法解决呢?我在 python 中写了一个很小的任务队列,它可以在一个单独的线程中调用 plotly.write函数。下面是程序代码。


from threading import Thread
import Queue 
import time

class TaskQueue(Queue.Queue):

首先我们继承 Queue.Queue 类。从 Queue.Queue 类可以继承 get 和 put 方法,以及队列的行为。


def __init__(self, num_workers=1):
  Queue.Queue.__init__(self)
  self.num_workers = num_workers
  self.start_workers()

初始化的时候,我们可以不用考虑工作线程的数量。


def add_task(self, task, *args, **kwargs):
  args = args or ()
  kwargs = kwargs or {}
  self.put((task, args, kwargs))

我们把 task, args, kwargs 以元组的形式存储在队列中。*args 可以传递数量不等的参数,**kwargs 可以传递命名参数。


def start_workers(self):
  for i in range(self.num_workers):
    t = Thread(target=self.worker)
    t.daemon = True
    t.start()

我们为每个 worker 创建一个线程,然后在后台删除。

下面是 worker 函数的代码:


def worker(self):
  while True:
    tupl = self.get()
    item, args, kwargs = self.get()
    item(*args, **kwargs) 
    self.task_done()

worker 函数获取队列顶端的任务,并根据输入参数运行,除此之外,没有其他的功能。下面是队列的代码:

我们可以通过下面的代码测试


def blokkah(*args, **kwargs):
  time.sleep(5)
  print “Blokkah mofo!”

q = TaskQueue(num_workers=5)

for item in range(1):
  q.add_task(blokkah)

q.join() # wait for all the tasks to finish.

print “All done!”

Blokkah 是我们要做的任务名称。队列已经缓存在内存中,并且没有执行很多任务。下面的步骤是把主队列当做单独的进程来运行,这样主程序退出以及执行数据库持久化时,队列任务不会停止运行。但是这个例子很好地展示了如何从一个很简单的小任务写成像工作队列这样复杂的程序。


def gradient_descent():
  # the gradient descent code
  queue.add_task(plotly.write, x=X, y=Y)

修改之后,我的梯度下降算法工作效率似乎更高了。如果你很感兴趣的话,可以参考下面的代码。


from threading import Thread
import Queue
import time

class TaskQueue(Queue.Queue):

def __init__(self, num_workers=1):
Queue.Queue.__init__(self)
self.num_workers = num_workers
self.start_workers()

def add_task(self, task, *args, **kwargs):
args = args or ()
kwargs = kwargs or {}
self.put((task, args, kwargs))

def start_workers(self):
for i in range(self.num_workers):
t = Thread(target=self.worker)
t.daemon = True
t.start()

def worker(self):
while True:
tupl = self.get()
item, args, kwargs = self.get()
item(*args, **kwargs)
self.task_done()

def tests():
def blokkah(*args, **kwargs):
time.sleep(5)
print "Blokkah mofo!"

q = TaskQueue(num_workers=5)

for item in range(10):
q.add_task(blokkah)

q.join() # block until all tasks are done
print "All done!"

if __name__ == "__main__":
tests()

--结束END--

本文标题: Python实现简单多线程任务队列

本文链接: https://www.lsjlt.com/news/15309.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python实现简单多线程任务队列
    最近我在用梯度下降算法绘制神经网络的数据时,遇到了一些算法性能的问题。梯度下降算法的代码如下(伪代码): def gradient_descent(): # the gradient descent...
    99+
    2022-06-04
    队列 多线程 简单
  • JavaScript单线程和任务队列是什么
    这篇文章主要讲解了“JavaScript单线程和任务队列是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript单线程和任务队列是什么”吧!一、JavaScript为什么设计...
    99+
    2023-06-17
  • python 多线程简单实现
    1. 线程是什么?线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。2 为什么要用线程?a 单个线程可以在进程中独立运行c 并行操作,适用于C/S架构3 python怎么生成线程(将函数生...
    99+
    2023-01-31
    多线程 简单 python
  • JavaScript单线程和任务队列使用实例分析
    这篇文章主要介绍“JavaScript单线程和任务队列使用实例分析”,在日常操作中,相信很多人在JavaScript单线程和任务队列使用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScrip...
    99+
    2023-06-20
  • JavaScript单线程和任务队列的示例分析
    这篇文章给大家分享的是有关JavaScript单线程和任务队列的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、JavaScript为什么设计为单线程?JavaScri...
    99+
    2022-10-19
  • Python实现线程池之线程安全队列
    目录一、线程池组成二、线程安全队列的实现三、测试逻辑3.1、测试阻塞逻辑3.2、测试读写加锁逻辑本文实例为大家分享了Python实现线程池之线程安全队列的具体代码,供大家参考,具体内...
    99+
    2022-11-11
  • laravel多线程执行队列怎么实现
    在Laravel中,可以使用`illuminate/queue`组件来实现多线程执行队列的功能。首先,需要在项目中安装`illumi...
    99+
    2023-09-06
    laravel
  • JAVA多线程之实现用户任务排队并预估排队时长
    目录实现流程排队论简介代码具体实现接口测试补充知识BlockingQueue阻塞与非阻塞 实现流程 初始化一定数量的任务处理线程和缓存线程池,用户每次调用接口,开启一个线程处理。 ...
    99+
    2022-11-12
  • python 简单的多线程链接实现代码
    服务端: #!/usr/bin/env import SocketServer class myMonitorHandler(SocketServer.BaseRequestHandler): def...
    99+
    2022-06-04
    多线程 代码 简单
  • Python实现简单的多任务mysql转xml的方法
    本文实例讲述了Python实现简单的多任务mysql转xml的方法。分享给大家供大家参考,具体如下: 为了需求导出的格式尽量和navicat导出的xml一致。 用的gevent,文件i/o操作会阻塞,所以并...
    99+
    2022-06-04
    简单 方法 Python
  • JAVA多线程怎么实现用户任务排队并预估排队时长
    这篇文章主要介绍“JAVA多线程怎么实现用户任务排队并预估排队时长”,在日常操作中,相信很多人在JAVA多线程怎么实现用户任务排队并预估排队时长问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JAVA多线程怎么...
    99+
    2023-06-22
  • Python如何实现多线程处理任务
    小编给大家分享一下Python如何实现多线程处理任务,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!读取Excel数据 —> 发送到行政服务接口安全起见线上操作放在了晚上进行。运行时发现每条数据导入消耗1s多,晚上十点...
    99+
    2023-06-25
  • python 多线程实现多任务的方法示例
    目录1 多线程实现多任务1.1 什么是线程?1.2 一个程序实现多任务的方法1.3 多线程的创建方式1.3.1 创建threading.Thread对象1.3.2 继承threading...
    99+
    2022-06-02
    python 多线程实现多任务 python 多线程多任务
  • Python 多线程处理任务实例
    目录美餐每天发一个用Excel汇总的就餐数据,我们把它导入到数据库后,行政办公服务用它和公司内的就餐数据进行比对查重。 初始实现是单线程,和import_records去掉多线程后的...
    99+
    2022-11-12
  • Python中的多线程实例(简单易懂)
    目录1.python中显示当前线程信息的属性和方法2.添加一个线程3.线程中的join函数4.使用Queue存储线程的结果5.线程锁lock前言: 多线程简单理解就是:一个CPU,也...
    99+
    2022-11-11
  • python 简单搭建阻塞式单进程,多进程,多线程服务的实例
    我们可以通过这样子的方式去理解apache的工作原理 1 单进程TCP服务(堵塞式) 这是最原始的服务,也就是说只能处理个客户端的连接,等当前客户端关闭后,才能处理下个客户端,是属于阻塞式等待 fro...
    99+
    2022-06-04
    进程 多线程 实例
  • Golang并发编程:利用Go WaitGroup实现任务队列
    Go语言的WaitGroup是用来等待一组goroutine执行完毕的工具,可以用来实现任务队列。下面是一个使用WaitGroup实...
    99+
    2023-10-08
    Golang
  • C#实现多线程编程的简单案例
    目录一、使用线程的理由二、基本知识三、线程的使用四、线程池五、Task类六、委托异步执行一、使用线程的理由 1、可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。2、可以使用线...
    99+
    2022-11-13
  • Qt5.9实现简单的多线程实例(类QThread)
    Qt开启多线程,主要用到类QThread。有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run()。当要开启新线程时,只需要实例该类,然后调用函数start(),就...
    99+
    2022-11-12
  • java中的消息队列怎么利用多线程实现
    java中的消息队列怎么利用多线程实现?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。定义一个队列缓存池: //static修饰的成员变量和成员方法独立于该类的任何对象...
    99+
    2023-05-31
    java 多线程 ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作