欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python django使用多進(jìn)程連接mysql錯(cuò)誤的解決方法

 更新時(shí)間:2018年10月08日 08:59:51   作者:orangleliu  
這篇文章主要介紹了Python django使用多進(jìn)程連接mysql錯(cuò)誤的解決方法,詳細(xì)的介紹了解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

問(wèn)題

mysql 查詢出現(xiàn)錯(cuò)誤

error: (2014, "Commands out of sync; you can't run this command now")1

查詢

mysql文檔中的解釋

  If you get Commands out of sync; you can't run this command now in your client code, you are calling client functions in the wrong order.
  This can happen, for example, if you are using mysql_use_result() and try to execute a new query before you have called mysql_free_result(). It can also happen if you try to execute two queries that return data without calling mysql_use_result() or mysql_store_result() in between.

調(diào)用順序錯(cuò)誤,同一個(gè)連接,發(fā)出2個(gè)查詢請(qǐng)求,第一個(gè)請(qǐng)求發(fā)出之后沒(méi)有等到mysql返回就發(fā)出第二個(gè)請(qǐng)求

背景 思考

我這里的程序是這樣的,在django框架中起了一個(gè)定時(shí)任務(wù),這個(gè)任務(wù)中有個(gè)循環(huán),主線程循環(huán)查詢mysql然后在循環(huán)體中生成了子進(jìn)程,子進(jìn)程中也有mysql查詢。

我測(cè)試了下不實(shí)用多進(jìn)程的情況沒(méi)有問(wèn)題,使用多進(jìn)程就會(huì)出現(xiàn)這個(gè)問(wèn)題。

對(duì)照上面的文檔,其實(shí)不難想到,錯(cuò)誤應(yīng)該是這樣的

  1. 父進(jìn)程和mysql建立的連接A,循環(huán)中fork出一個(gè)子進(jìn)程
  2. 子進(jìn)程保持了父進(jìn)程的變量,也就是擁有mysql連接A
  3. 子進(jìn)程去用連接A查詢mysql,父進(jìn)程這個(gè)時(shí)候也并發(fā)的使用連接A訪問(wèn)mysql
  4. 這樣很容易出現(xiàn)了上面Mysql提到的情況,結(jié)果就報(bào)錯(cuò)了

 

解決

解決的方案其實(shí)很容易想到,就是當(dāng)我們fork一個(gè)進(jìn)程之后,讓他從新獲取一個(gè)和mysql的連接C或者D就好了嘛,
結(jié)果幾個(gè)測(cè)試,得到如下的方案。

在父進(jìn)程的loop中,創(chuàng)建子進(jìn)程之前關(guān)閉mysql連接,這樣子進(jìn)程中就會(huì)重新連接mysql。

  from django import db
  db.close_connection()
  p = Process(target=ap5mintes_scan, args=(ac, details, mtime))
  p.start()

其實(shí)就是狀態(tài)copy的問(wèn)題,本來(lái)多個(gè)線程同時(shí)并發(fā)調(diào)用一個(gè)connection也不對(duì).

后面做了個(gè)測(cè)試 ,多進(jìn)程的情況下查看mysql processlist,的確使用建立多個(gè)mysql 連接。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論