python 伪多线程_Python实现简单多线程任务队列
最近我在用梯度下降算法绘制神经网络的数据时,遇到了一些算法性能的问题。梯度下降算法的代码如下(伪代码):
1
2
3
def gradient_descent():
# the gradient descent code
plotly.write(X, Y)
一般来说,当网络请求 plot.ly 绘图时会阻塞等待返回,于是也会影响到其他的梯度下降函数的执行速度。
一种解决办法是每调用一次 plotly.write 函数就开启一个新的线程,但是这种方法感觉不是很好。 我不想用一个像 cerely(一种分布式任务队列)一样大而全的任务队列框架,因为框架对于我的这点需求来说太重了,并且我的绘图也并不需要 redis 来持久化数据。
那用什么办法解决呢?我在 python 中写了一个很小的任务队列,它可以在一个单独的线程中调用 plotly.write函数。下面是程序代码。
1
2
3
4
5
from threadingimport Thread
import Queue
import time
class TaskQueue(Queue.Queue):
首先我们继承 Queue.Queue 类。从 Queue.Queue 类可以继承 get 和 put 方法,以及队列的行为。
1
2
3
4
def __init__(self, num_workers=1):
Queue.Queue.__init__(self)
self.num_workers= num_workers
self.start_workers()
初始化的时候,我们可以不用考虑工作线程的数量。
1
2
3
4
def add_task(self, task,*args,**kwargs):
args= argsor ()
kwargs= kwargsor {}
self.put((task, args, kwargs))
我们把 task, args, kwargs 以元组的形式存储在队列中。*args 可以传递数量不等的参数,**kwargs 可以传递命名参数。
1
2
3
4
5
def start_workers(self):
for iin range(self.num_workers):
t= Thread(target=self.worker)
t.daemon= True
t.start()
我们为每个 worker 创建一个线程,然后在后台删除。
下面是 worker 函数的代码:
1
2
3
4
5
6
def worker(self):
while True:
tupl= self.get()
item, args, kwargs= self.get()
item(*args,**kwargs)
self.task_done()
worker 函数获取队列顶端的任务,并根据输入参数运行,除此之外,没有其他的功能。下面是队列的代码:
我们可以通过下面的代码测试:
1
2
3
4
5
6
7
8
9
10
11
12
def blokkah(*args,**kwargs):
time.sleep(5)
print “Blokkah mofo!”
q= TaskQueue(num_workers=5)
for itemin range(1):
q.add_task(blokkah)
q.join()# wait for all the tasks to finish.
print “All done!”
Blokkah 是我们要做的任务名称。队列已经缓存在内存中,并且没有执行很多任务。下面的步骤是把主队列当做单独的进程来运行,这样主程序退出以及执行数据库持久化时,队列任务不会停止运行。但是这个例子很好地展示了如何从一个很简单的小任务写成像工作队列这样复杂的程序。
1
2
3
def gradient_descent():
# the gradient descent code
queue.add_task(plotly.write, x=X, y=Y)
修改之后,我的梯度下降算法工作效率似乎更高了。如果你很感兴趣的话,可以参考下面的代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from threadingimport 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= argsor ()
kwargs= kwargsor {}
self.put((task, args, kwargs))
def start_workers(self):
for iin 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 itemin range(10):
q.add_task(blokkah)
q.join()# block until all tasks are done
print "All done!"
if __name__== "__main__":
tests()
python 伪多线程_Python实现简单多线程任务队列相关推荐
- python任务队列框架_Python实现简单多线程任务队列
def gradient_descent(): # the gradient descent code plotly.write(X, Y) 一般来说,当网络请求 plot.ly 绘图时会阻塞等待返回 ...
- python 协程 多线程_python进阶之多线程(简单介绍协程)
多线程 线程:实现多任务的另一种方式 一个进程中,也经常需要同时做多件事,就需要同时运行多个'子任务',这些子任务,就是线程 线程又被称为轻量级进程(lightweight process),是更小的 ...
- python tcp服务器 多线程_Python中的多线程TCP服务器
我使用python的threding模块创建了一个简单的多线程tcp服务器.每次连接新客户端时,该服务器都会创建一个新线程. #!/usr/bin/env python import socket, ...
- python如何开启多线程_Python如何创建多线程
Python提供了_thread和threading两个模块来支持多线程,但_thread提供低级别的.原始的县城支持,以及一个简单的锁,通常情况下我们使用后者,来进行多线程编程 创建多线程 使用th ...
- python如何调用c函数实现真正意义的多线程_python如何使用多线程执行多个函数?...
之前小编给大家介绍了用python去返回了一个值,立马就有小伙伴跟小编留言说道"能都执行多个内容?"于是,小编就给大家整理最细致,也是最简单的实现方法,方便大家理解学习,一起来看下 ...
- python如何使用多线程_python如何使用多线程
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...
- python io密集 多线程_python多进程和多线程究竟谁更快(详解)
python3.6 threading和multiprocessing 四核+三星250G-850-SSD 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很多都说python多进程更快,因为 ...
- python for多线程_python for 怎么多线程
2017-10-22 回答 python支持多线程效果还不错,很多方面都用到了python 多线程的知识,我前段时间用python 多线程写了个处理生产者和消费者的问题,把代码贴出来给你看下: #en ...
- python点对点传输_python点对点简单实现
这篇文章主要为大家详细介绍了python实现简单点对点p2p聊天,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 点对点聊天首先是基于多线程的网络编程,其次就是将每一个连接都保存为一个具有独一属性的 ...
最新文章
- 尤雨溪携手字节前端专家,畅聊 Vue 3.0 前端技术新趋势
- Reading-又更新了一些内容【Kotlin+MVP+Retrofit】
- js 运算符 || 妙用
- Spring MVC,Ajax和JSON第1部分–设置场景
- c程序怎么改为java程序_如何将Java程序的入口点更改为C签名?
- 【报告分享】2022十大科技趋势-达摩院.pdf(附下载链接)
- L2-039 清点代码库 (25 分)-PAT 团体程序设计天梯赛 GPLT
- 用PHP实现手机对jar,jad文件的下载(转)
- 笔记本电脑网卡驱动损坏问题
- OneNote使用技巧 - 2.将网页内容保存到OneNote中
- stn算子_STN 口袋指南
- B站股权曝光:陈睿持股12.9%阿里持股7.9% 寻求双重主要上市
- Echarts实现以秒为单位的动态三条折线图显示
- 网站源码 HTML和源代码有什么区别?他俩是什么关系?
- IPhone多视图切换
- 0基础学绘画怎么临摹
- 阿拉丁年会 - 小程序开发者年度盛会 报告内容摘要
- 计算机应用大赛宣传稿,江苏开放大学计算机应用基础中国名城宣传片
- python计算模型psi_模型稳定度指标PSI与IV
- 自学编程的妙方法,直接省了几万块钱报班,不收藏就可惜了!
热门文章
- 【Flink】Flink classloader.check-leaked-classloader
- 【kafka】Kafka消费者分区分配策略详解
- 【flink】Flink-Cep实现规则动态更新
- 【kafka】kafka 中 消息 record 格式
- 【Elasticsearch】极限网关 INFINI Gateway 初体验
- 【kafka】kafka jmx topic 监控 topic 名称不存在 或者 topic监控是如何出现的呢 或者 topic监控机制
- 【Flink】大数据分析常用去重算法分析『HyperLogLog 篇』
- Spark Structured Kudu : RejectedExecutionException: Worker has already been shutdown
- 编辑服务器上的文件,Sublime Text编辑远程Linux服务器上的文件
- linux fuse 阻塞,FUSE原理总结