在我们的Python/Django应用程序的开发过程中,我们不小心在requirements.txt中引入了安装库的冲突版本的包需求.Heroku已经缓存了python buildpack指定的CACHE_DIR中的破坏需求,正如他们的buildpack API信息页面上所记录的那样,似乎对requirements.txt文件的任何修改都不能清除已损坏软件包的缓存.我们如何强制Heroku完全清空CACHE_DIR并从头开始重新安装所有需求和依赖项?
我正在研究各种OS设计,希望为DCPU-16编写简单的多任务操作系统.但是,我读到的关于抢先式多任务处理的所有内容都以中断为中心.听起来在16位硬件和软件时代,协作式多任务处理更为常见,但这需要考虑每个程序的多任务处理.
有没有办法在无中断架构上实现抢占式多任务处理?我能想到的只是一个可以动态切换任务的解释器,但这会产生巨大的性能损失(如果它必须解析每个操作并且不让任何东西本地运行,可能会大约10-20x +,我是想象).
我在Django中创建一个稀疏首选项表.我的模型很简单:
class Preference(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='preferences')
preference = models.CharField(max_length=255, db_index=True)
value = models.BooleanField()
Run Code Online (Sandbox Code Playgroud)
某些首选项具有默认状态,因此我需要能够向数据库询问两个问题:"哪些用户将此首选项设置为某个值?" 和"哪些用户没有将此首选项设置为该值(因为他们没有设置首选项,或者因为他们主动将首选项设置为另一个值)?"
我的问题是前一个问题有效,但后一个问题(相同的查询条款,但用一个exclude()而不是一个filter())不起作用.例如:
我的测试数据库有14个用户,单个用户有两个首选项:'PREF_A'设置为True和'PREF_B'设置为False.
>>> User.objects.all().count()
14
>>> User.objects.filter(preferences__preference="PREF_A", preferences__value=True).count()
1
>>> User.objects.exclude(preferences__preference="PREF_A", preferences__value=True).count()
13
>>> User.objects.filter(preferences__preference="PREF_A", preferences__value=False).count()
0
>>> User.objects.exclude(preferences__preference="PREF_A", preferences__value=False).count()
13
Run Code Online (Sandbox Code Playgroud)
所以,我的结果说:
共有14位用户
1个用户将PREF_A设置为True
13个用户没有将PREF_A设置为True
0个用户将PREF_A设置为False
13个用户没有将PREF_A设置为False <---这是不准确的
此查询在哪里出错,如何编写查询以正确排除将特定首选项设置为特定值的人?
我尝试过使用Q并~Q查看行为是否会有所不同,但结果是一样的.
我试图在一个事务中将数百万行数据加载到一个表(一个"跟随"表,其中包含两个用户表的外键,以及这些键上的相关索引).我的初始尝试导致我的脚本崩溃,因为系统内存已耗尽.
一些研究得出结论,崩溃是由于外键约束,所以我验证表是空的(即导致进程被杀死的事务没有完成)并修改我的脚本以删除外来键约束和索引以插入数据.我的目的是在之后重新创建约束和索引.
但是,ALTER TABLE DROP CONSTRAINT命令删除表上的第一个外键约束需要很长时间(几十分钟),尽管表完全为空.
我唯一能想到的是它与我写入表中的大量数据有关,然后没有提交,因为脚本崩溃了.但是,当然,由于事务没有提交,我在数据库中找不到任何数据跟踪.
什么可能导致此查询缓慢(或可能根本不运行;在撰写本文时它仍在进行中),我该如何避免它?
在数据库中打开了其他事务(迁移其他非常大的表的数小时长事务),但这些事务都没有触及后续表.
编辑:pg锁定如下:
db=# select relation::regclass, * from pg_locks where not granted;
-[ RECORD 1 ]------+--------------------
relation | auth_user
locktype | relation
database | 53664
relation | 54195
page |
tuple |
virtualxid |
transactionid |
classid |
objid |
objsubid |
virtualtransaction | 5/343
pid | 17300
mode | AccessExclusiveLock
granted | f
Run Code Online (Sandbox Code Playgroud)
上面的pid(17300)就是ALTER TABLE查询本身.没有其他锁,也没有进程等待锁.
我不确定是否有一种现有的方法可以做到这一点,但是使用 asset_sync 的想法是资产是从 S3 或某些 CDN(例如 cloudfront)提供的,因此不需要成为应用程序 slug 的一部分。是否有可能在 Heroku 上的 .slugignore 中包含 /assets 并且仍然使资产:预编译和资产同步工作?如果我只是将 /assets 放在 .slugignore 中,它们不会与摘要一起编译,并且对资产的引用没有指纹,因此不起作用。
我使用Twisted来异步访问Python中的数据库.我的代码看起来像这样:
from twisted.enterprise import adbapi
from MySQLdb import _mysql as mysql
...
txn.execute("""
INSERT INTO users_accounts_data_snapshots (accountid, programid, fieldid, value, timestamp, jobid)
VALUES ('%s', '%s', '%s', '%s', '%s', '%s')
""" % (accountid, programid, record, mysql.escape_string(newrecordslist[record]), ended, jobid))
Run Code Online (Sandbox Code Playgroud)
这一直有效,直到我遇到这个字符:®,这导致线程抛出异常: `exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 7: ordinal not in range(128)
但是,如果我不使用MySQLdb_mysql.escape_string(),当输入包含引号等(当然)时,我会收到数据库错误.在访问数据库之前发生异常,因此数据库的整理似乎根本不重要.
在不对unicode字符抛出异常的情况下,逃避此内容的最佳方法是什么?理想的解决方案是我可以传递unicode字符,不会干扰查询以及MySQL不受干扰; 然而,剥离unicode字符串,用问号替换它们,修改它们或其他任何可以阻止崩溃的东西都是可以接受的.
我有一些代码使用该requests模块与日志记录 API 进行通信。然而,requests它本身通过 进行urllib3日志记录。当然,我需要禁用日志记录,以便对日志记录 API 的请求不会导致日志无限循环。因此,在我进行日志记录调用的模块中,我会logging.getLogger("requests").setLevel(logging.CRITICAL)静音例行请求日志。
但是,此代码旨在加载和运行任意用户代码。由于 pythonlogging模块显然使用全局状态来管理给定记录器的设置,我担心用户的代码可能会重新打开日志记录并导致问题,例如,如果他们天真地在代码中使用 requests 模块,而没有意识到我已禁用日志记录这是有原因的。
当从我的代码上下文中执行请求模块时,如何禁用该模块的日志记录,但从用户的角度来看,不影响该模块的记录器的状态?某种类型的上下文管理器可以静默对管理器内代码的日志记录的调用,这将是理想的选择。能够使用唯一的名称加载请求模块,__name__以便记录器使用不同的名称也可以工作,尽管这有点复杂。不过,我找不到办法做这两件事。
遗憾的是,该解决方案需要处理多个线程,因此按程序关闭日志记录,然后运行 API 调用,然后重新打开它将不起作用,因为全局状态已发生变化。
someDict = {'foo': True}
if 'foo' in someDict and someDict['foo']:
print 'success'
Run Code Online (Sandbox Code Playgroud)
以下代码工作正常.我只是想知道是否有更好/更短的方法来检查密钥是否存在且其值是否为真.
我正在尝试确定Python mock.patch(unittest.mock.patch在Py3中)上下文管理器是否会改变全局状态,即它是否是线程安全的.
例如:让我们假设一个线程bar在函数内foo使用上下文管理器修补函数,然后在上下文管理器中,解释器暂停该线程(因为GIL等)并恢复另一个foo在所述上下文管理器之外运行的线程.如果patch是线程安全的我期望的功能的全局状态foo和bar未修改,所以第二个线程将获得的正常行为foo.但是如果patch修改全局状态,第二个线程将获得修改后的行为,foo即使它不在上下文管理器中.
我提到了源代码,但仅通过查看它就无法清楚地说出来.
python ×5
heroku ×2
buildpack ×1
cdn ×1
dcpu-16 ×1
dictionary ×1
django ×1
django-orm ×1
global-state ×1
interrupt ×1
logging ×1
multitasking ×1
mysql ×1
postgresql ×1
precompile ×1
python-2.7 ×1
python-mock ×1
twisted ×1