我们有一个 Flask 应用程序,它使用 eventlet 工作线程通过 gunicorn 提供服务。我们正在 kubernetes pod 中部署应用程序,其想法是根据工作负载扩展 pod 的数量。
gunicorn 中工人数量的推荐设置是2 - 4 x $NUM_CPUS. 请参阅文档。我以前在专用的物理硬件上部署了服务,这样的计算是有意义的。在 4 核机器上,有 16 名工人听起来不错,我们最终将其增加到 32 名工人。
这个计算是否仍然适用于使用异步工作者的 kubernetes pod,特别是:
我应该如何设置 gunicorn 工人的数量?
-w 1并让 kubernetes 通过 pod 处理缩放?2-4 x $NUM_CPU在 kubernetes 节点上将其设置为。在一个吊舱还是多个吊舱?我们决定采用第一个选项,这是我们目前的方法。将 gunicorn 作品的数量设置为 1,并通过增加 Pod 的数量进行水平缩放。否则将会有太多活动部件,而且我们将无法充分利用 Kubernetes 的潜力。
我有多个进程,可能会在数据库中插入重复的行。这些插入不会很频繁地发生(每小时几次),因此它对性能并不重要。
在进行插入之前,我已经尝试过存在检查,如下所示:
#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表。
我正在尝试使用闭包表对组织为分层树的数据进行建模.表示树中节点的条目没什么特别之处,定义如下.
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) 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) 我正在尝试发送带有电子邮件正文的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的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语句中做错了,有效地手动调用构造函数.我该如何纠正?
我有一个包含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) 假设我有一个表定义如下:
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.此时,插入此表的条目分两步进行.
我正在寻找一种方法来完全避免第二次更新,并使用一个insert语句完成所有操作.这可能吗?我正在使用MS SQL Server 2005.
ps我同意这不是世界上最明智的模式,这个模式将被重构(并正确规范化)但我现在无法对模式进行更改.
我无法在Flot中获得一致的条宽.我有的图表可以有1到10个数据点.当有10个数据点时,条形图的大小正确.但是,当数据点少于10时,图表中的条形开始变胖.以下两张图片证明了这一点.

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

当只有一件商品时,酒吧变得非常大.
我知道这个barWidth属性,我试过改变它.问题是它只影响图表中条形图的大小,只有10个项目,但它只留下图表中的胖条.
我还在某处读过我可以尝试更改div包含图表的高度,但我想避免这种情况,因为我希望图表具有固定的尺寸,而不管显示的项目如何.
我在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列与查询集中的每一行具有相同的值.
我正在尝试编写一个与常用的编程语言运算符相匹配的正则表达式.这是我正在使用的正则表达式字符串(它是更大表达式的一部分):
[>|<|>=|<=|==|!=]
Run Code Online (Sandbox Code Playgroud)
这与">","<"匹配,但与其他任何一个都不匹配.我试过逃避它们\>\=,\=\=但它没有什么区别.
我确信这很简单,我遗漏了一些明显的东西.
我有一个表,其中有一列整数表示type行.这些整数的范围是1 - 5.如何在SQLAlchemy中指定自定义排序顺序,例如,如果我希望按以下顺序排序行[4, 2, 3, 5, 1]?
我知道Enum数据类型,但它映射到数据库后端的VARCHAR,并且不能更改架构.
python ×7
charts ×2
django ×2
flot ×2
javascript ×2
orm ×2
sql ×2
sqlalchemy ×2
database ×1
email ×1
eventlet ×1
flask ×1
group-by ×1
gunicorn ×1
kubernetes ×1
logging ×1
pyinstaller ×1
pywin32 ×1
raii ×1
regex ×1
scaling ×1
sql-server ×1
t-sql ×1