V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
scott123
V2EX  ›  Python

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

  •  
  •   scott123 · 2016-08-09 23:29:34 +08:00 · 3662 次点击
    这是一个创建于 3065 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 的线程问题。
    7 条回复    2016-08-11 11:22:34 +08:00
    tinyproxy
        1
    tinyproxy  
       2016-08-10 00:00:28 +08:00
    1. 伪代码是用来描述算法的,你这个问题是工程问题,跟算法没一毛钱关系。
    2. 既然想别人帮你解决问题,提供个能复现问题的代码好么。。。就这点东西,完全看不到线程操作,也看不到函数实现,能看出什么问题就见鬼了。。。
    3. 吐槽一下,你发邮件居然不用队列,直接卡住请求。。。
    4. 一个建议,既然觉得是线程问题,打 log 调试吧
    jimmyye
        2
    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
        3
    upwell  
       2016-08-10 11:23:23 +08:00
    list 是 mutable 的, 传到 save_into_data 里面,可能被改掉了,这个流程多半都是同步的,跟线程没关系。
    sigmadg
        4
    sigmadg  
       2016-08-10 16:58:17 +08:00
    save_into_data 应该是用了 django 的 orm 吧, django 的 orm 存库是需要转成 model 来存的,和线程确实没关系
    scott123
        5
    scott123  
    OP
       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
        6
    yufpga  
       2016-08-11 09:35:04 +08:00
    不看 save_into_data 的源码,仅凭这些描述是看不出来问题的, 此外尽量不要使用 eval, 使用 json.loads 进行反序列化.
    jimmyye
        7
    jimmyye  
       2016-08-11 11:22:34 +08:00   ❤️ 1
    @scott123 其实上面几个回复都提到了:
    1. django 本身是同步的,如果你没有自己写异步操作或者使用第三方异步 orm ,那么整个过程就是同步的,不存在线程问题。
    2. 确保没有修改 item_list ,根据你的描述, save_to_data()修改了 item_list ,所以 send_email 里的 list 才会有问题,建议不同的变量使用不同名称:比如 item=eval(item)容易混乱。
    3. 如无必要,不要用 eval
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   975 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 21:01 · PVG 05:01 · LAX 13:01 · JFK 16:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.