Django 在保存列表数据到数据库和调用列表数据的时候存在线程问题,怎么解决?

2016-08-09 23:29:34 +08:00
 scott123
def index(request):
item_list=request.post.get('item_list')
save_into_data(item_list)
send_email(item_lsit)
return HttpResponse('hello world')

函数伪代码大概就是这样, save_into_data()和 send_email)内都有一个 for 循环,类似于这样 for item in item_list:
item_list 就是一个 list ,但是会出现在 send_email 循环的时候 item 变成一个 model 对象,但是调用这个对象有调用不了,不太清楚是自己如何处理 django 的线程问题。
3470 次点击
所在节点    Python
7 条回复
tinyproxy
2016-08-10 00:00:28 +08:00
1. 伪代码是用来描述算法的,你这个问题是工程问题,跟算法没一毛钱关系。
2. 既然想别人帮你解决问题,提供个能复现问题的代码好么。。。就这点东西,完全看不到线程操作,也看不到函数实现,能看出什么问题就见鬼了。。。
3. 吐槽一下,你发邮件居然不用队列,直接卡住请求。。。
4. 一个建议,既然觉得是线程问题,打 log 调试吧
jimmyye
2016-08-10 01:11:39 +08:00
同楼上,建议问问题的时候描述问题的本身,而不是先自己推测为线程问题。
item 为什么会变成 model ? item_list 不应该在 save_into_data()里被修改,如果需要保持 model 实例,应该用另一个 list :
item_instances = save_into_data(item_list)
send_email(item_lsit)
upwell
2016-08-10 11:23:23 +08:00
list 是 mutable 的, 传到 save_into_data 里面,可能被改掉了,这个流程多半都是同步的,跟线程没关系。
sigmadg
2016-08-10 16:58:17 +08:00
save_into_data 应该是用了 django 的 orm 吧, django 的 orm 存库是需要转成 model 来存的,和线程确实没关系
scott123
2016-08-11 08:13:56 +08:00
@jimmyye @tinyproxy @upwell @sigmadg 我这里指的线程是 Django 自己运行的线程,并不是我自己写线程,用伪代码是应为写的长肯定没有人会看,实际代码很多,我在更佳详细的描述一下,实际我的 list 里是一个有前台传过来的 unicode 的字典,所以使用了 eval(),在 save_to_data()里的大概是这样的 for item in item_lis : item=eval(item)然后取出每一个值赋值到参数, orm 的 model 然后写入数据库,然后 send_emai()也是差不多的代码, for item in item_lis : item=eval(item)取出值,但是没有保存的动作,调换发邮件和保存的顺序就不会出现错误。两种情况都有查看 item 的类型变化,当先保存后发邮件的时候, item 会变成, model.receiving.object,我也获得的对象的 ID ,但是无法访问。不会用 V2EX 的编辑器,比 stackoverflow 还难用。
yufpga
2016-08-11 09:35:04 +08:00
不看 save_into_data 的源码,仅凭这些描述是看不出来问题的, 此外尽量不要使用 eval, 使用 json.loads 进行反序列化.
jimmyye
2016-08-11 11:22:34 +08:00
@scott123 其实上面几个回复都提到了:
1. django 本身是同步的,如果你没有自己写异步操作或者使用第三方异步 orm ,那么整个过程就是同步的,不存在线程问题。
2. 确保没有修改 item_list ,根据你的描述, save_to_data()修改了 item_list ,所以 send_email 里的 list 才会有问题,建议不同的变量使用不同名称:比如 item=eval(item)容易混乱。
3. 如无必要,不要用 eval

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/298252

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX