我正在做django的项目,只是一个人项目。
我用芹菜尝试django的项目,并在芹菜中添加两个任务。
一个任务,是关于蜘蛛按请求写入,获取一些代理ip信息并通过django orm保存到mysql,这是update_or_create(defaults = {'ip':'','port':''},* * {'key':'value'})。我保持这个任务总是由一个工人通过redis lock控制数据。比如,一个工作运行任务,redis lock get,另一个工作尝试锁定失败,并且没有控制数据。
另一项任务,是一个蜘蛛,由龙卷风写,用于检查代理ip数据。此外,由一名工人通过redis锁运行。龙卷风的蜘蛛也是一个单线程。
这两项任务可能同时进行。
当我几个小时后运行项目时,大约几个小时后。我发现mysql中的一些数据是相同的。 ip,port和其他一些是相同的。
当代码运行到update_or_create()时出现错误:
数据如何来?在我的想法中,虽然最多两个线程会一起运行,但一个是使用updata_or_create,一个是使用.save()。任务使用save()不会重生数据?而update_or_create()会检查数据get(),它意味着来自无数据库中没有像这个ip和端口这样的数据,但它有。
有人可以向我解释原因吗?
答案 0 :(得分:1)
如果ip和port是决定是否创建新实例的唯一两点,那么它应该是:
ProxyData.objects.update_or_create(ip_address=data.get('ip_address'),ip_port=data.get('ip_port'),defaults=**data)
但是
ProxyData.objects.update_or_create(defaults=default,**data)
表示如果某个实例符合**data
,则更新它的ip和port。如果我猜对了,这正好与你想要的相反。