小编Cad*_*nge的帖子

Kubernetes 和 Gunicorn 上的 Flask 应用程序扩展

我们有一个 Flask 应用程序,它使用 eventlet 工作线程通过 gunicorn 提供服务。我们正在 kubernetes pod 中部署应用程序,其想法是根据工作负载扩展 pod 的数量。

gunicorn 中工人数量的推荐设置是2 - 4 x $NUM_CPUS. 请参阅文档。我以前在专用的物理硬件上部署了服务,这样的计算是有意义的。在 4 核机器上,有 16 名工人听起来不错,我们最终将其增加到 32 名工人。

这个计算是否仍然适用于使用异步工作者的 kubernetes pod,特别是:

  1. 单个节点上可能有多个 Pod。
  2. 相同的服务将在多个 Pod 中运行。

我应该如何设置 gunicorn 工人的数量?

  1. 将其设置为-w 1并让 kubernetes 通过 pod 处理缩放?
  2. 2-4 x $NUM_CPU在 kubernetes 节点上将其设置为。在一个吊舱还是多个吊舱?
  3. 完全是别的什么?

更新

我们决定采用第一个选项,这是我们目前的方法。将 gunicorn 作品的数量设置为 1,并通过增加 Pod 的数量进行水平缩放。否则将会有太多活动部件,而且我们将无法充分利用 Kubernetes 的潜力。

scaling flask eventlet gunicorn kubernetes

12
推荐指数
1
解决办法
3720
查看次数

SQLAlchemy和显式锁定

我有多个进程,可能会在数据库中插入重复的行。这些插入不会很频繁地发生(每小时几次),因此它对性能并不重要。

在进行插入之前,我已经尝试过存在检查,如下所示:

#Assume we're inserting a camera object, that's a valid SQLAlchemy ORM object that inherits from declarative_base...
try:
  stmt = exists().where(Camera.id == camera_id)
  exists_result = session.query(Camera).with_lockmode("update").filter(stmt).first()

  if exists_result is None:
    session.add(Camera(...)) #Lots of parameters, just assume it works
    session.commit()
except IntegrityError as e:
  session.rollback()
Run Code Online (Sandbox Code Playgroud)

exist()遇到的问题是检查不会锁定表,因此,多个进程可能会尝试同时插入同一对象。在这种情况下,一个过程通过插入成功,而其他过程则由于IntegrityError异常而失败。虽然这样做有效,但对我来说感觉并不“干净”。

我真的很想在进行exists()检查之前锁定Camera表。

python orm sqlalchemy

8
推荐指数
1
解决办法
1万
查看次数

Django ORM和闭包表

我正在尝试使用闭包表对组织为分层树的数据进行建模.表示树中节点的条目没什么特别之处,定义如下.

class Region(models.Model):
    RegionGuid = models.CharField(max_length=40, unique=True, db_column='RegionGUID', blank=True)
    CustomerId = models.IntegerField(null=True, db_column='CustomerID', blank=True)
    RegionName = models.CharField(max_length=256, db_column='RegionName', blank=True)
    Description = models.TextField(db_column="Description", blank=True)
    class Meta:
        db_table = u'Region'
Run Code Online (Sandbox Code Playgroud)

使用以下闭包表定义节点之间的路径.它包括一个到祖先节点的FK,到后代节点的FK和Ancestor和Descendant之间的路径长度(即节点数):

class RegionPath(models.Model):
    Ancestor = models.ForeignKey(Region, null=True, db_column='Ancestor', blank=True)
    Descendant = models.ForeignKey(Region, null=True, db_column='Descendant', blank=True)
    PathLength = models.IntegerField(null=True, db_column='PathLength', blank=True)
    class Meta:
        db_table = u'RegionPath'
Run Code Online (Sandbox Code Playgroud)

现在我将如何检索所有Region行及其各自的父节点(即RegionPath.PathLength = 1)?我的SQL略显生锈,但我认为SQL查询看起来应该是这样的.

SELECT r.* from Region as r 
LEFT JOIN 
(SELECT r2.RegionName, p.Ancestor, p.Descendant from Region as r2 INNER JOIN RegionPath as p on …
Run Code Online (Sandbox Code Playgroud)

python sql django django-queryset transitive-closure-table

5
推荐指数
1
解决办法
908
查看次数

来自 Python 可执行文件的 NTEventLogHandler

import logging, logging.handlers

def main():
    ntl = logging.handlers.NTEventLogHandler("Python Logging Test")
    logger = logging.getLogger("")
    logger.setLevel(logging.DEBUG)
    logger.addHandler(ntl)
    logger.error("This is a '%s' message", "Error")


if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

上面的 Python (2.7.x) 脚本将“这是一条‘错误’消息”写入 Windows 事件查看器。当我将其作为脚本运行时,我得到了预期的输出。如果我通过 PyInstaller 将脚本转换为可执行文件,我会在事件日志中获得一个条目,但它会显示完全不同的内容。

无法在源(Python 日志记录测试)中找到事件 ID (1) 的描述。本地计算机可能没有必要的注册表信息或消息 DLL 文件来显示来自远程计算机的消息。您可以使用 /AUXSOURCE= 标志来检索此描述;有关详细信息,请参阅帮助和支持。以下信息是该事件的一部分: 这是一条“错误”消息。

这是我用来将脚本转换为可执行文件的命令:pyinstaller.py --onefile --noconsole my_script.py尽管命令行参数似乎对此行为没有任何影响,只需调用pyinstaller.py my_script.py.

如果您能帮助我了解发生的情况以及我如何解决此问题,我将不胜感激。

最终解决方案

我不想走资源黑客路线,因为这将是自动化的一个困难步骤。相反,我采取的方法是win32service.pyd从 c:\Python27\Lib\site-packages\win32 中获取文件并将其放在我的可执行文件旁边。然后修改脚本,将完整路径传递给文件副本win32service.pyd,这在脚本和 exe 形式中都有效。最终脚本如下:

import logging, logging.handlers
import os
import sys

def main():
    base_dir = os.path.dirname(sys.argv[0])
    dllname = os.path.join(base_dir, "win32service.pyd") …
Run Code Online (Sandbox Code Playgroud)

python logging pywin32 pyinstaller

4
推荐指数
1
解决办法
2849
查看次数

使用Python发送带有HTML + plain_text电子邮件的PDF附件

我正在尝试发送带有电子邮件正文的PDF附件,该电子邮件正文总结了PDF文件的内容.电子邮件正文包含HTML和纯文本.

我正在使用以下代码来构建电子邮件消息对象:

#Part A
logging.debug("   Building standard email with HTML and Plain Text")
msg = MIMEMultipart("alternative")
msg.attach(MIMEText(email_obj.attachments["plain_text"], "plain", _charset="utf-8"))
msg.attach(MIMEText(email_obj.attachments["html_text"], "html", _charset="utf-8"))

#Part B
logging.debug("   Adding PDF report")
pdf_part = MIMEApplication(base64.decodestring(email_obj.attachments["pdf_report"]), "pdf")
pdf_part.add_header('Content-Disposition', 'attachment', filename="pdf_report.pdf")
logging.debug("   Attaching PDF report")
msg.attach(pdf_part)
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我附上PDF,我的电子邮件正文就会消失.如果我注释掉附加PDF的代码(B部分),则会显示电子邮件正文.

除非我弄错了,看起来好像我的PDF附件正在覆盖电子邮件正文.

python email email-attachments

4
推荐指数
1
解决办法
5849
查看次数

Python语句

我正在试验Python的with语句,我发现在下面的代码清单中,我的__init__方法被调用两次,而我的__exit__方法被调用一次.这可能意味着如果此代码执行任何有用的操作,将会出现资源泄漏.

class MyResource:
    def __enter__(self):
        print 'Entering MyResource'
        return MyResource()

    def __exit__(self, exc_type, exc_value, traceback):
        print 'Cleaning up MyResource'

    def __init__(self):
        print 'Constructing MyResource'

    def some_function(self):
        print 'Some function'

def main():
    with MyResource() as r:
        r.some_function()

if __name__=='__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

这是程序的输出:

Constructing MyResource
Entering MyResource
Constructing MyResource
Some function
Cleaning up MyResource
Run Code Online (Sandbox Code Playgroud)

我猜这是因为我在with语句中做错了,有效地手动调用构造函数.我该如何纠正?

python raii with-statement

3
推荐指数
2
解决办法
1403
查看次数

Flot无法在某些浏览器上呈现图表

我有一个包含2个系列的简单折线图,x轴是日期,y轴是整数.说明这一点的代码如下:

<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript" language="javascript" src="flot/jquery.js"></script>
    <script type="text/javascript" language="javascript" src="flot/jquery.flot.js"></script>
    <style type="text/css">
        #overview-plot24 {
            width: 94%;
            margin-left: 20px;
            height: 220px;
        }
    </style>

    <script type="text/javascript">
        $(function() {
            var plotOptions = {
                //Options go here
                xaxis: {
                    mode: "time",
                    tickLength: 5,
                    reserveSpace: true,
                    autoscaleMargin: 0.01
                },
                yaxis: {
                    min: 0
                },
                legend: {
                    show: false
                },
                series: {
                    lineWidth: 1,
                    shadowSize: 0
                },
                grid: {
                    hoverable: true,
                    clickable: true
                }
            };

            var plot2 = $.plot(
                    '#overview-plot24', [
                        {
                            label: …
Run Code Online (Sandbox Code Playgroud)

javascript charts flot

3
推荐指数
1
解决办法
2465
查看次数

在SQL中避免两步插入

假设我有一个表定义如下:

CREATE TABLE SomeTable
(
P_Id int PRIMARY KEY IDENTITY,
CompoundKey varchar(255) NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)

CompoundKey是一个字符串,其主键P_Id连接到末尾,如Foo00000001,它来自"Foo"+ 00000001.此时,插入此表的条目分两步进行.

  1. 为CompoundKey插入带有占位符字符串的虚拟记录.
  2. 使用生成的复合键更新CompoundKey.

我正在寻找一种方法来完全避免第二次更新,并使用一个insert语句完成所有操作.这可能吗?我正在使用MS SQL Server 2005.

ps我同意这不是世界上最明智的模式,这个模式将被重构(并正确规范化)但我现在无法对模式进行更改.

sql t-sql database sql-server

2
推荐指数
1
解决办法
172
查看次数

flot图表中的条宽一致

我无法在Flot中获得一致的条宽.我有的图表可以有1到10个数据点.当有10个数据点时,条形图的大小正确.但是,当数据点少于10时,图表中的条形开始变胖.以下两张图片证明了这一点.

细条

当有10个项目时,酒吧的大小适中.

胖吧

当只有一件商品时,酒吧变得非常大.

我知道这个barWidth属性,我试过改变它.问题是它只影响图表中条形图的大小,只有10个项目,但它只留下图表中的胖条.

我还在某处读过我可以尝试更改div包含图表的高度,但我想避免这种情况,因为我希望图表具有固定的尺寸,而不管显示的项目如何.

javascript charts flot

2
推荐指数
1
解决办法
3650
查看次数

Django按小时组

我在Django中有以下模型.

class StoreVideoEventSummary(models.Model):
    Customer = models.ForeignKey(GlobalCustomerDirectory, null=True, db_column='CustomerID', blank=True, db_index=True)
    Store = models.ForeignKey(Store, null=True, db_column='StoreID', blank=True, related_name="VideoEventSummary")
    Timestamp = models.DateTimeField(null=True, blank=True, db_index=True)
    PeopleCount = models.IntegerField(null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

我想知道每小时进入商店的人数.

为了实现这一点,我试图按小时对行进行分组并对列进行Timestamp求和PeopleCount.

store_count_events = StoreVideoEventSummary.objects.filter(Timestamp__range=(start_time, end_time),
                                                       Customer__id=customer_id,
                                                       Store__StoreName=store)\
        .order_by("Timestamp")\
        .extra({
            "hour": "date_part(\'hour\', \"Timestamp\")"
        }).annotate(TotalPeople=Sum("PeopleCount"))
Run Code Online (Sandbox Code Playgroud)

这似乎不按小时对结果进行分组,它只是添加一个新列TotalPeople,该PeopleCount列与查询集中的每一行具有相同的值.

python django orm group-by

2
推荐指数
1
解决办法
3426
查看次数

使用正则表达式匹配运算符(例如==,> =)

我正在尝试编写一个与常用的编程语言运算符相匹配的正则表达式.这是我正在使用的正则表达式字符串(它是更大表达式的一部分):

[>|<|>=|<=|==|!=]
Run Code Online (Sandbox Code Playgroud)

这与">","<"匹配,但与其他任何一个都不匹配.我试过逃避它们\>\=,\=\=但它没有什么区别.

我确信这很简单,我遗漏了一些明显的东西.

regex

1
推荐指数
1
解决办法
51
查看次数

SQLALchemy自定义整数排序顺序

我有一个表,其中有一列整数表示type行.这些整数的范围是1 - 5.如何在SQLAlchemy中指定自定义排序顺序,例如,如果我希望按以下顺序排序行[4, 2, 3, 5, 1]

我知道Enum数据类型,但它映射到数据库后端的VARCHAR,并且不能更改架构.

python sqlalchemy

1
推荐指数
1
解决办法
1196
查看次数