有大神告訴我爲何pymysql導入失敗

  import json
  
  import requests
  
  import pymysql
  
  url = 'https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id=-1&count=10&category=111'
  
  headers = {
  
  'Cookie': 'aliyungf_tc=AQAAALoQF3p02gsAUhVFebQ3uBBNZn+H; xq_a_token=584d0cf8d5a5a9809761f2244d8d272bac729ed4; xq_a_token.sig=x0gT9jm6qnwd-ddLu66T3A8KiVA; xq_r_token=98f278457fc4e1e5eb0846e36a7296e642b8138a; xq_r_token.sig=2Uxv_DgYTcCjz7qx4j570JpNHIs; _ga=GA1.2.516718356.1534295265; _gid=GA1.2.1050085592.1534295265; u=301534295266356; device_id=f5c21e143ce8060c74a2de7cbcddf0b8; Hm_lvt_1db88642e346389874251b5a1eded6e3=1534295265,1534295722; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1534295722',
  
  'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
  
  }
  
  while True:
  
  response = requests.get(url,headers=headers)
  
  res_dict = json.loads(response.text)
  
  next_id = res_dict['next_max_id']
  
  next_url = 'https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id='+str(next_id)+'&count=10&category=111'
  
  url = next_url
  
  list_list = res_dict['list']
  
  for list_item in list_list:
  
  data_str = list_item['data']
  
  data_str = json.loads(data_str)
  
  s_id = data_str['id']
  
  s_title = data_str['title']
  
  s_description = data_str['description']
  
  s_target = data_str['target']
  
  #寫入mysql
  
  db = pymysql.connect(host='127.0.0.1',user='root',password='123456',port='3306',database='xueqiu',charset='utf-8')
  
  cursor = db.cursor(www.leyouzaixian2.com)
  
  sql = "insert into iceball values (null ,'{}','{}','{}','{}')".format(s_id,s_title,s_description,s_target)
  
  cursor.execute(sql)
  
  db.commit(www.yigouyule2.cn)
  
  cursor.close()
  
  db.close(www.hjylp178.com)
  
  # 寫入文件版本
  
  # temp = str(s_id) + ' ' + str(s_title) + ' ' + str(s_description) + ' ' + s_target
  
  # print(temp)
  
  # with open('xinwen.html','a',encoding='utf-8') as f:
  
  # f.write(temp + '\n')
  
  ---------------------
  
  這個例子和第一個例子相比,惟一不一樣就是ngx.say輸出內容長了很多,咱們發現瀏覽器先收到全部的hello,接着又收到了"the world" 。然而若是咱們把4000改成小一點的值如2000(不一樣配置這個相對大小或有不一樣),那麼仍然會出現先停頓3s,而後全部"hello"連同最後"the world"一塊兒輸出的狀況。
  
  經過以上三個例子,咱們能夠得出下面的結論:
  
  ngx.say和ngx.print的同步和異步
  
  nginx有個輸出緩衝(system send buffer),如16k。ngx.say和ngx.print默認是向這個輸出緩衝寫入數據,若是沒有顯示的調用ngx.flush,那麼在content階段結束後輸出緩衝會寫入客戶端;
  
  若是沒有ngx.flush也沒有到結束階段,但若是輸出緩衝區滿了,那麼也會輸出到客戶端;
  
  所以ngx.say和ngx.print的默認向客戶端的輸出都是異步的,非實時性的,改變這一行爲的是ngx.flush,能夠作到同步和實時輸出。這在流式輸出,好比下載大文件時很是有用。
  
  ngx.flush的同步和異步
  
  lua-nginx也提到了ngx.flush的同步和異步。某一個ngx.say或者ngx.print調用後,這部分輸出內容會寫到輸出緩衝區,同步的方式ngx.flush(true)會等到內容所有寫到緩衝區再輸出到客戶端,而異步的方式ngx.flush()會將內容一邊寫到緩衝區,而緩衝區則一邊將這些內容輸出到客戶端。
  
  openresty和nginx流式輸出的比較
  
  流式輸出,或者大文件的下載,nginx的upstream模塊已經作得很是好,能夠經過proxy_buffering|proxy_buffer_size|proxy_buffers 等指令精細調控,並且這些指令的默認值已經作了妥善處理。咱們來看看這些指令以及默認值:
  
  proxy_buffering on;
  
  proxy_buffer_size 4k|8k;
  
  proxy_buffers 8 4k|8k;
  
  proxy_busy_buffers_size 8k|16k;
  
  proxy_temp_path proxy_temp;
  
  proxy_buffering on表示內存作總體緩衝,內存不夠時多餘的存在由proxy_temp_path指定的臨時文件中,off表示不作任何輸出緩衝,從上游響應中接收一點就向客戶端輸出一點
  
  proxy_buffer_size和proxy_buffers都是指定內存緩衝區的大小,默認爲一頁的大小,proxy_buffers還能夠指定這樣的緩衝區的個數
  
  proxy_busy_buffers_size 這個"busy"看得出,這個指令必定是用在比較繁忙的時候了。在比較繁忙的時候(高併發或者大文件下載)時,就沒有必要等到上游響應所有來了再發給客戶端,能夠來了一部分(proxy_busy_buffers_size)就發過去。於此同時,緩衝區的另外部分能夠繼續讀。若是內存緩衝區不夠用了,還能夠開啓文件緩衝區
  
  proxy_temp_path 使用文件做爲接受上游請求的緩衝區buffer,當內存不夠用時啓用
  
  openresty的怎麼作到過大響應的輸出呢? 《OpenResty 最佳實踐》 提到了兩種狀況:
  
  輸出內容自己體積很大,例如超過 2G 的文件下載
  
  輸出內容自己是由各類碎片拼湊的,碎片數量龐大
  
  前面一種狀況很是常見,後面一種狀況好比上游已經開啓Chunked的傳輸方式,並且每片chunk很是小。筆者就遇到了一個上游服務器經過Chunked分片傳輸日誌,而爲了節省上游服務器的內存將每片設置爲一行日誌,通常也就幾百字節,這就太「碎片」了,通常日誌總在幾十到幾百M,這麼算下來chunk數量多大10w+。筆者用了resty.http來實現文件的下載,文件總大小48M左右。
  
  local http = require "resty.http"
  
  local httpc = http.new()
  
  httpc:set_timeout(6000)
  
  httpc:connect(host, port)
  
  local client_body_reader, err = httpc:get_client_body_reader()
  
  local res, err = httpc:request({
  
  version = 1.1,
  
  method = ngx.var.request_method,
  
  path = ngx.var.app_uri,
  
  headers = headers,
  
  query = ngx.var.args,
  
  body = client_www.dfgjpt.com body_reader
  
  })
  
  if not res www.hjshidpt.com then
  
  ngx.say("Failed www.huarenyl.cn to request ".www.furong157.com. ngx.var.app_name .." server: ", err)
  
  return
  
  end
  
  -- Response status
  
  ngx.status = res.status
  
  -- Response headers
  
  for k, v in pairs(res.headers) do
  
  if k ~= "Transfer-www.michenggw.com/ Encoding" then --必須刪除上游Transfer-Encoding響應頭
  
  ngx.header[k] = v
  
  end
  
  endhtml

相關文章
相關標籤/搜索