2015-10-20 55 views
5

Tôi đang cố gắng chuyển kết nối mysql đến một luồng trong python. Nếu tôi khởi tạo mysql bên trong lớp nhân viên, không có lỗi.Nhận đường ống bị hỏng khi chuyển kết nối mysql đến một chủ đề python

Tuy nhiên, có thể tốn kém cho kết nối vì vậy tôi đã thử chỉ chuyển kết nối mysql từ hàm người gọi (xem mã bên dưới). Nhưng điều này tiếp tục ném lỗi này:

(2006, "MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))

Bất kỳ ý tưởng nào tại sao? Tôi nghĩ rằng nó bởi vì cách chúng ta vượt qua kết nối mysql

def worker(db): 
""" Distributes the workload for a thread 
""" 
while True: 
    item = queue_handler.get() 
    perform_insert(item, db) 
    queue_handler.task_done() 

def insert_bulk(params): 
""" Handles the insert 
""" 
    cntr = 0 
    res = [] 
    cannot_read = [] 
    (data, cms, report_id) = params 

    db = nmi_mysql.DB(CONFIG['earnings_db'], True) 

    for i in range(10): 
     thrd = threading.Thread(target=worker, args=(db,)) 
     thrd.deamon = True 
     thrd.start() 

    for row in data: 
     split_files = row.split(',') 

     if len(split_files) != 34: 
      cannot_read.append(split_files) 
      continue 

     now = datetime.datetime.now() 

     res.append(<some data to insert>) 

     if len(res) == 750 or cntr == len(data): 
      queue_handler.put([res, cms, report_id]) 
      res = [] 

     cntr += 1 

    queue_handler.join() 

    db.close() 

    return [len(res), cms] 

CẬP NHẬT

Thay vì đi qua các kết nối mysql, chúng tôi tạo ra một hồ bơi kết nối và sử dụng hồ bơi trong các chủ đề. Bằng cách này, chúng tôi chỉ nhận được kết nối từ các hồ bơi trên cấp độ thread.

+0

Thông thường, các kết nối cơ sở dữ liệu không được sử dụng giữa các luồng máy khách khác nhau: Chúng không phải là _thread-safe_. Nếu không ai cung cấp cho bạn câu trả lời tốt hơn, tôi khuyên bạn nên xử lý từng kết nối vào cùng một luồng: mở, sử dụng và đóng. –

+0

@LittleSanti chúng tôi đã sử dụng một hồ bơi kết nối để thay thế. Hoạt động thực sự tốt. – Ninz

+0

OK khi sử dụng hồ bơi trong khi bạn xử lý mọi kết nối hoàn toàn trong cùng một chuỗi: nhận kết nối, sử dụng nó, giải phóng nó. Lý do vẫn như cũ: Các kết nối thường không an toàn chỉ. –

Trả lời

2

Kết nối cơ sở dữ liệu không phải là luồng an toàn, do đó bạn không nên chuyển chúng từ chuỗi này sang chuỗi khác. Một hồ bơi kết nối nắm giữ các kết nối mở giữa các yêu cầu, do đó, nó nhanh hơn để có được một kết nối từ các hồ bơi, sử dụng nó cho một truy vấn, và sau đó phát hành nó.

Điều này related answer có một số liên kết hữu ích về an toàn luồng của kết nối cơ sở dữ liệu.

+0

Câu trả lời của tôi chủ yếu là tóm tắt các nhận xét. Tôi vừa đăng nó để câu hỏi này sẽ bị xóa khỏi danh sách các câu hỏi chưa được trả lời. –

Các vấn đề liên quan