gunicorn给worker分配GPU

在gunicorn的config文件(myconfig.py)中添加如下配置代码:

import os
import time

try:
    import pynvml 
    pynvml.nvmlInit()
    gpuDeviceCount = pynvml.nvmlDeviceGetCount()
except:
    gpuDeviceCount = 1
    
gpuDevicePool = []

def pre_fork(server, worker):
    try:
        gid = gpuDevicePool.pop(0)
    except:
        gid = (worker.age - 1) % gpuDeviceCount
    worker.gid = gid

def post_fork(server,worker):
    time.sleep(worker.age % server.cfg.workers)
    os.environ['CUDA_VISIBLE_DEVICES'] = str(worker.gid)
    server.log.info(f'worker(age:{worker.age}, pid:{worker.pid}, cuda:{worker.gid})')
    
def child_exit(server, worker):
    gpuDevicePool.append(worker.gid)

启动服务:

gunicorn -c myconfig.py server:app -w 16

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的Flask-SocketIO和Gunicorn的WebSocket示例,可以设置多个worker数量: ```python from flask import Flask, render_template from flask_socketio import SocketIO, emit app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' socketio = SocketIO(app) @app.route('/') def index(): return render_template('index.html') @socketio.on('connect') def test_connect(): emit('my response', {'data': 'Connected'}) @socketio.on('disconnect') def test_disconnect(): print('Client disconnected') @socketio.on('my event') def handle_my_custom_event(json): print('received json: ' + str(json)) emit('my response', json) if __name__ == '__main__': socketio.run(app) ``` 其中,`@socketio.on`装饰器用于处理WebSocket的事件。在这个例子中,我们定义了三个事件: - `connect`:客户端连接到服务器时触发 - `disconnect`:客户端断开连接时触发 - `my event`:客户端发送自定义事件时触发 这些事件的处理函数可以根据自己的需要进行编写。 为了使用Gunicorn启动应用程序,我们需要创建一个名为`wsgi.py`的文件: ```python from app import app, socketio if __name__ == '__main__': socketio.run(app) ``` 然后,我们可以使用以下命令启动Gunicorn: ``` gunicorn wsgi:app -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 4 ``` 其中,`-k`选项指定WebSocket工作器,这里我们使用`geventwebsocket.gunicorn.workers.GeventWebSocketWorker`。`-w`选项指定工作进程的数量,这里我们设置为4。 最后,我们需要在`index.html`中添加一些JavaScript代码以连接到WebSocket: ```html <!DOCTYPE html> <html> <head> <title>Flask-SocketIO Example</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/3.0.4/socket.io.js"></script> <script src="//code.jquery.com/jquery-1.11.1.js"></script> <script type="text/javascript" charset="utf-8"> $(document).ready(function() { var socket = io.connect('http://' + document.domain + ':' + location.port); socket.on('connect', function() { socket.emit('my event', {data: 'I\'m connected!'}); }); socket.on('my response', function(msg) { $('#log').append('<p>Received: ' + JSON.stringify(msg.data) + '</p>'); }); socket.on('disconnect', function() { console.log('Disconnected'); }); $('form#emit').submit(function(event) { socket.emit('my event', {data: $('#emit_data').val()}); return false; }); }); </script> </head> <body> <h1>Flask-SocketIO Example</h1> <form id="emit"> <input type="text" id="emit_data"> <input type="submit" value="Send"> </form> <div id="log"></div> </body> </html> ``` 在这个例子中,我们使用了jQuery来处理WebSocket的事件。当客户端连接到服务器时,我们发送一个自定义事件`my event`。当服务器返回`my response`事件时,我们将接收到的数据显示在页面上。当客户端断开连接时,我们在控制台中输出一条消息。 希望这个例子可以帮助你理解如何使用Flask-SocketIO和Gunicorn创建WebSocket应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值