我使用Celery来执行异步后台任务,Redis作为后端.我对Celery工作人员在以下情况下的行为感兴趣:
我正在使用一个守护进程作为守护进程celeryd.已通过该-Q选项为此工作人员分配了两个队列以供使用:
celeryd -E -Q queue1,queue2
Run Code Online (Sandbox Code Playgroud)
工作人员如何决定从哪里获取下一个要使用的任务?是否随机消耗任何一个任务queue1或queue2?它会优先获取,queue1因为它是传递给参数列表中的第一个-Q吗?
在Python字典中为键/值对分配变量是否有明确的最佳实践:
否则为变量分配默认值.
我想用dict.get:
my_value = dict.get(key, my_default)
Run Code Online (Sandbox Code Playgroud)
但是my_value如果键存在且值为空字符串,则会为其分配一个空字符串.使用以下内容是否更好:
if key in dict and dict[key]:
my_value = dict[key]
else:
my_value = my_default
Run Code Online (Sandbox Code Playgroud)
这将利用空字符串的真实性来确保仅分配非空字符串my_value.
有没有更好的方法来执行此检查?
我目前正在尝试从YouTube用户上传Feed中提取有关视频的数据.此Feed包含特定用户上传的所有视频,并可通过以下请求从API访问:
http://gdata.youtube.com/feeds/api/users/USERNAME/uploads
Run Code Online (Sandbox Code Playgroud)
USERNAME是拥有Feed的YouTube用户的名称.
但是,我在尝试访问超过1000个视频的Feed时遇到了问题.由于每个API请求都可以返回50个项目,因此我使用max_length和start_index遍历feed,如下所示:
http://gdata.youtube.com/feeds/api/users/USERNAME/uploads?start-index=1&max-results=50&orderby=published
http://gdata.youtube.com/feeds/api/users/USERNAME/uploads?start-index=51&max-results=50&orderby=published
Run Code Online (Sandbox Code Playgroud)
依此类推,每次调用时start_index增加50.这完美地工作直到:
http://gdata.youtube.com/feeds/api/users/USERNAME/uploads?start-index=1001&max-results=50&orderby=published
Run Code Online (Sandbox Code Playgroud)
此时我收到400错误通知我'您不能请求超出项目1000'.这让我很困惑,因为我认为查询只会返回50个视频:1001-1051,按照最近发布的顺序排列.浏览完文档后,我发现了这一点:
限制结果计数和可访问结果
...
对于任何给定的查询,即使有多个结果,您也无法检索超过1,000个结果.如果您尝试检索超过1,000个结果,API将返回错误.因此,如果将start-index查询参数设置为值1001或更大,API将返回错误.如果start-index和max-results参数的总和大于1,001,它也将返回错误.
例如,如果将start-index参数值设置为1000,则必须将max-results参数值设置为1,如果将start-index参数值设置为980,则必须设置max-results参数值为21或更低.
我不知道如何以一致的方式访问通用用户上次上传的第1001个视频及其他视频,因为它们无法仅使用max-results和start-index进行索引.有没有人对如何避免这个问题有任何有用的建议?我希望我清楚地概述了这个难点!
我知道在Django中使用MyModel.objects.create时,可以使用与MyModel中的模型字段对应的键传入字典.这在另一个问题中解释:可以在创建时将字典传递给django模型吗?
但是,我试图传入一个字典,其中包含比模型字段更多的键 - 换句话说,某些键不用于创建对象.是否有可能以某种方式做到这一点?例如:
data_dict = {
'key1': value1,
'key2': value2,
'key3': value3,
}
class MyModel(models.Model):
key1 = models.SomeField()
key2 = models.SomeField()
m = MyModel.objects.create(**data_dict)
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,我收到一个错误,告诉我"'key3'是这个函数的无效关键字参数".我错误地传递了字典吗?有没有不同的方法将它传递给模型,这意味着模型不必使用所有参数?或者我只需要手动指定每个字段,如下所示:
m = MyModel.objects.create(
key1 = data_dict['key1'],
key2 = data_dict['key2'],
)
Run Code Online (Sandbox Code Playgroud) dictionary ×2
python ×2
celery ×1
celeryd ×1
django ×1
gdata ×1
string ×1
youtube ×1
youtube-api ×1