1.谁能告诉一下用循环队列实现打印杨辉三角形的循环循环C语言代码?
2.go语言中的channel实现原理是什么?
3.如何在后台部署深度学习模型
4.C语言用数组实现循环队列的入队出队
谁能告诉一下用循环队列实现打印杨辉三角形的C语言代码?
#include <stdio.h>
#include <iostream.h>
#include "queue.h"
void YANGHUI(int n) {
SeqQueue q(n+2); //队列初始化p
q.EnQueue(1); q.EnQueue(1);
int s = 0, t;
for (int i = 1; i <= n; i++) { //逐行计算
cout << endl;
q.EnQueue(0);
for (int j = 1; j <= i+2; j++) { //下一行
q.DeQueue(t);
q.EnQueue(s + t);
s = t;
if (j != i+2) cout << s << ' ';
}
}
}
课件地址:/view/cbd5ed2bb4ec0ba.html
3.3.4 队列的应用:打印杨辉三角形。
go语言中的队列队列channel实现原理是什么?
channel在Go语言中用于不同协程之间的通信,实现机制基于hchan结构体和循环队列。源码源码channel的循环循环底层实现包含sendx、recvx、队列队列sendq、源码源码大闸蟹网站源码recvq等关键元素,循环循环以及sudog结构体用于管理被阻塞的队列队列goroutine。
创建channel时主要涉及内存分配与初始化,源码源码makechan()函数负责此过程,循环循环确保创建的队列队列channel具备所需属性,如数据个数和等待队列。源码源码
发送数据分为同步、循环循环异步与阻塞三种模式,队列队列同步发送和接收数据的源码源码处理逻辑通过流程图和源码展现,异步发送与接收则通过类似方式实现。阻塞发送与接收则在适当条件下等待资源可用,发送操作的源码实现为chansend函数,接收操作为chanrecv函数。
关闭channel涉及释放资源与唤醒被阻塞的qca9984 源码goroutine,通过closechan()函数执行这一流程,确保所有等待的goroutine能够继续执行。
讨论Go channel的底层实现过程中的疑问,包括是否会被垃圾回收、elemtype *_type的用途、KeepAlive源码的作用、无缓冲channel的应用场景以及gopark goready的内核态切换问题。这些问题可以通过深入研究Go语言的源码和相关资料来解答。
如何在后台部署深度学习模型
搭建深度学习后台服务器我们的Keras深度学习REST API将能够批量处理图像,扩展到多台机器(包括多台web服务器和Redis实例),并在负载均衡器之后进行循环调度。
为此,我们将使用:
KerasRedis(内存数据结构存储)
Flask (Python的微web框架)
消息队列和消息代理编程范例
本篇文章的整体思路如下:
我们将首先简要讨论Redis数据存储,以及如何使用它促进消息队列和消息代理。然后,我们将通过安装所需的Python包来配置Python开发环境,以构建我们的Keras深度学习REST API。一旦配置了开发环境,就可以使用Flask web框架实现实际的spring源码测试类Keras深度学习REST API。在实现之后,我们将启动Redis和Flask服务器,然后使用cURL和Python向我们的深度学习API端点提交推理请求。最后,我们将以对构建自己的深度学习REST API时应该牢记的注意事项的简短讨论结束。
第一部分:简要介绍Redis如何作为REST API消息代理/消息队列
1:Redis可以用作我们深度学习REST API的消息代理/消息队列
Redis是内存中的数据存储。它不同于简单的键/值存储(比如memcached),因为它可以存储实际的数据结构。今天我们将使用Redis作为消息代理/消息队列。这包括:
在我们的机器上运行Redis
将数据(图像)按照队列的方式用Redis存储,并依次由我们的REST API处理
为新批输入图像循环访问Redis
对图像进行分类并将结果返回给客户端
文章中对Redis官网有一个超链接(")这一行中,我将这个操作与终端打印消息连接起来——根据Keras模型的大小,加载是即时的,或者需要几秒钟。
加载模型只在启动这个线程时发生一次——如果每次我们想要处理一个映像时都必须加载模型,那么速度会非常慢,而且由于内存耗尽可能导致服务器崩溃。
加载模型后,这个线程将不断轮询新的商务管理平台源码图像,然后将它们分类(注意这部分代码应该时尚一部分的继续)
在这里,我们首先使用Redis数据库的lrange函数从队列(第行)中获取最多的BATCH_SIZE图像。从那里我们初始化imageIDs和批处理(第和行),并开始在第行开始循环队列。
在循环中,我们首先解码对象并将其反序列化为一个NumPy数组image(第-行)。
接下来,在第-行中,我们将向批处理添加图像(或者如果批处理当前为None,我们将该批处理设置为当前图像)。
我们还将图像的id附加到imageIDs(第行)。
让我们完成循环和函数
在这个代码块中,我们检查批处理中是否有图像(第行)。如果我们有一批图像,我们通过模型(第行)对整个批进行预测。从那里,我们循环一个图像和相应的预测结果(-行)。这些行向输出列表追加标签和概率,然后使用imageID将输出存储在Redis数据库中(第-行)。330理财游戏源码
我们使用第行上的ltrim从队列中删除了刚刚分类的图像集。最后,我们将睡眠设置为SERVER_SLEEP时间并等待下一批图像进行分类。下面我们来处理/predict我们的REST API端点
稍后您将看到,当我们发布到REST API时,我们将使用/predict端点。当然,我们的服务器可能有多个端点。我们使用@app。路由修饰符以第行所示的格式在函数上方定义端点,以便Flask知道调用什么函数。我们可以很容易地得到另一个使用AlexNet而不是ResNet的端点,我们可以用类似的方式定义具有关联函数的端点。你懂的,但就我们今天的目的而言,我们只有一个端点叫做/predict。我们在第行定义的predict方法将处理对服务器的POST请求。这个函数的目标是构建JSON数据,并将其发送回客户机。如果POST数据包含图像(第和行),我们将图像转换为PIL/Pillow格式,并对其进行预处理(第-行)。
在开发这个脚本时,我花了大量时间调试我的序列化和反序列化函数,结果发现我需要第行将数组转换为C-contiguous排序(您可以在这里了解更多)。老实说,这是一个相当大的麻烦事,但我希望它能帮助你站起来,快速跑。
如果您想知道在第行中提到的id,那么实际上是使用uuid(通用唯一标识符)在第行生成的。我们使用UUID来防止hash/key冲突。
接下来,我们将图像的id和base编码附加到d字典中。使用rpush(第行)将这个JSON数据推送到Redis db非常简单。
让我们轮询服务器以返回预测
我们将持续循环,直到模型服务器返回输出预测。我们开始一个无限循环,试图得到-条预测线。从这里,如果输出包含预测,我们将对结果进行反序列化,并将结果添加到将返回给客户机的数据中。我们还从db中删除了结果(因为我们已经从数据库中提取了结果,不再需要将它们存储在数据库中),并跳出了循环(第-行)。
否则,我们没有任何预测,我们需要睡觉,继续投票(第行)。如果我们到达第行,我们已经成功地得到了我们的预测。在本例中,我们向客户机数据添加True的成功值(第行)。注意:对于这个示例脚本,我没有在上面的循环中添加超时逻辑,这在理想情况下会为数据添加一个False的成功值。我将由您来处理和实现。最后我们称烧瓶。jsonify对数据,并将其返回给客户端(第行)。这就完成了我们的预测函数。
为了演示我们的Keras REST API,我们需要一个__main__函数来实际启动服务器
第-行定义了__main__函数,它将启动classify_process线程(第-行)并运行Flask应用程序(第行)。
第五部分:启动可伸缩的Keras REST API
要测试我们的Keras深度学习REST API,请确保使用本文的“下载”部分下载源代码示例图像。从这里,让我们启动Redis服务器,如果它还没有运行:
redis-server 然后,在另一个终端中,让我们启动REST API Flask服务器:python run_keras_server.py 另外,我建议在向服务器提交请求之前,等待您的模型完全加载到内存中。现在我们可以继续使用cURL和Python测试服务器。第七部分:使用cURL访问Keras REST API
使用cURL来测试我们的Keras REST API服务器。这是我的家庭小猎犬Jemma。根据我们的ResNet模型,她被归类为一只拥有.6%自信的小猎犬。
curl -X POST -F image=@jemma.png 'http://localhost:/predict' 你会在你的终端收到JSON格式的预测:{ "predictions": [{ "label": "beagle","probability": 0.},{ "label": "bluetick","probability": 0.},{ "label": "redbone","probability": 0.},{ "label": "Walker_hound","probability": 0.},{ "label": "Greater_Swiss_Mountain_dog","probability": 0.}],"success": true} 第六部分:使用Python向Keras REST API提交请求如您所见,使用cURL验证非常简单。现在,让我们构建一个Python脚本,该脚本将发布图像并以编程方式解析返回的JSON。
让我们回顾一下simple_request.py
# import the necessary packagesimport requests# initialize the Keras REST API endpoint URL along with the input# image pathKERAS_REST_API_URL = "http://localhost:/predict"IMAGE_PATH = "jemma.png" 我们在这个脚本中使用Python请求来处理向服务器提交数据。我们的服务器运行在本地主机上,可以通过端口访问端点/predict,这是KERAS_REST_API_URL变量(第6行)指定的。我们还定义了IMAGE_PATH(第7行)。png与我们的脚本在同一个目录中。如果您想测试其他图像,请确保指定到您的输入图像的完整路径。
让我们加载图像并发送到服务器:
# load the input image and construct the payload for the requestimage = open(IMAGE_PATH, "rb").read()payload = { "image": image}# submit the requestr = requests.post(KERAS_REST_API_URL, files=payload).json()# ensure the request was sucessfulif r["success"]: # loop over the predictions and display them for (i, result) in enumerate(r["predictions"]): print("{ }. { }: { :.4f}".format(i + 1, result["label"], result["probability"]))# otherwise, the request failedelse: print("Request failed") 我们在第行以二进制模式读取图像并将其放入有效负载字典。负载通过请求发送到服务器。在第行发布。如果我们得到一个成功消息,我们可以循环预测并将它们打印到终端。我使这个脚本很简单,但是如果你想变得更有趣,你也可以使用OpenCV在图像上绘制最高的预测文本。第七部分:运行简单的请求脚本
编写脚本很容易。打开终端并执行以下命令(当然,前提是我们的Flask服务器和Redis服务器都在运行)。
python simple_request.py 使用Python以编程方式使用我们的Keras深度学习REST API的结果第八部分:扩展深度学习REST API时的注意事项
如果您预期在深度学习REST API上有较长一段时间的高负载,那么您可能需要考虑一种负载平衡算法,例如循环调度,以帮助在多个GPU机器和Redis服务器之间平均分配请求。
记住,Redis是内存中的数据存储,所以我们只能在队列中存储可用内存中的尽可能多的图像。
使用float数据类型的单个 x x 3图像将消耗字节的内存。
C语言用数组实现循环队列的入队出队
//定义一个int型数组que,长度为N(常量切大于2).
int que[N];
int rear=0,front=0; //队尾 队头
判断队列已满:
if((front+1)%N==rear%N) //成立则队列已满判断队列为空
if((rear==front)) //成立则队列空入队(一般在入队前判断队列是否已满)
//将val入队que[front++]=val;
front%=N;
出队(一般在出队前判断队列是否为空)
rear=(rear+1)%N;下一个要出队的元素(一般先判断是否为空)
que[rear];2024-12-24 09:17
2024-12-24 08:55
2024-12-24 08:33
2024-12-24 07:47
2024-12-24 07:19
2024-12-24 07:18