2015-01-12 15 views
6

Tôi có một kịch bản Python chính kết nối với một cơ sở dữ liệu MySQL và rút ra một vài bản ghi từ nó. Dựa trên kết quả trả về nó bắt đầu như nhiều chủ đề (các cá thể lớp) khi nhiều bản ghi được nắm bắt. Mỗi luồng sẽ quay trở lại cơ sở dữ liệu và cập nhật một bảng khác bằng cách đặt một cờ trạng thái sang trạng thái khác ("quá trình bắt đầu").Làm thế nào để xử lý các kết nối MySQL (s) với đa luồng Python

Để đạt được điều này tôi đã cố gắng để:

1.) Vượt qua kết nối cơ sở dữ liệu cho tất cả các chủ đề 2.) Mở một kết nối cơ sở dữ liệu mới từ mỗi thread

nhưng không ai trong số họ đang làm việc.

Tôi có thể chạy cập nhật mà không gặp bất kỳ vấn đề nào trong cả hai trường hợp bằng cách sử dụng try/except, nhưng bảng MySQL chưa được cập nhật và không có lỗi nào được tạo. Tôi đã sử dụng cam kết trong cả hai trường hợp.

Câu hỏi của tôi sẽ là cách xử lý (các) kết nối MySQL trong trường hợp này?

Cập nhật dựa trên vài ý kiến ​​đầu tiên:

MAIN SCRIPT 
----------- 

#Connecting to DB 
db = MySQLdb.connect(host = db_host, 
         db = db_db, 
         port = db_port, 
         user = db_user, 
         passwd = db_password, 
         charset='utf8') 

# Initiating database cursor 
cur = db.cursor() 

# Fetching records for which I need to initiate a class instance 

cur.execute('SELECT ...') 

for row in cur.fetchall() : 
    # Initiating new instance, appending it to a list and 
    # starting all of them 



CLASS WHICH IS INSTANTIATED 
--------------------------- 

# Connecting to DB again. I also tried to pass connection 
# which has been opened in the main script but it did not 
# work either. 

db = MySQLdb.connect(host = db_host, 
         db = db_db, 
         port = db_port, 
         user = db_user, 
         passwd = db_password, 
         charset='utf8') 

# Initiating database cursor 
cur_class = db.cursor() 
cur.execute('UPDATE ...') 
db.commit() 
+0

khó để nói bất cứ điều gì mà không biết làm thế nào bạn kết nối với DB của bạn và làm thế nào để bạn thực hiện các bản cập nhật. – Ashalynd

+0

Tôi không hiểu rõ câu hỏi của bạn. Là trường hợp đơn giản nhất làm việc, như python thread đơn kết nối với mysql và cập nhật một bảng? – qqibrow

+0

@Ashalynd Cảm ơn bạn đã dành thời gian! Và xin lỗi nhưng tôi là AFK. Tôi đã cập nhật câu hỏi của mình bằng một mã snipet từ mã chính và lớp học của mình. Đây là cách tôi bắt đầu các cá thể và mở các kết nối cơ sở dữ liệu. Tôi đã cố gắng để bắt lỗi khi mở kết nối và thực hiện truy vấn từ dụ với try/except mà không có bất kỳ may mắn. – g0m3z

Trả lời

3

Có vẻ như không có vấn đề gì với mã của tôi nhưng với phiên bản MySQL của tôi. Tôi đang sử dụng ấn bản cộng đồng tiêu chuẩn MySQL và dựa trên tài liệu chính thức được tìm thấy here:

Plugin nhóm là một tính năng thương mại. Nó không được bao gồm trong các bản phân phối cộng đồng MySQL.

Tôi sắp nâng cấp lên MariaDB để giải quyết vấn đề này.

9

Dưới đây là một ví dụ sử dụng đa luồng thỏa thuận mysql bằng Python, tôi không biết bảng và dữ liệu của bạn, vì vậy, chỉ cần thay đổi mã có thể trợ giúp:

import threading 
import time 
import MySQLdb 

Num_Of_threads = 5 

class myThread(threading.Thread): 

    def __init__(self, conn, cur, data_to_deal): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 
     self.conn = conn 
     self.cur = cur 
     self.data_to_deal 

    def run(self): 

     # add your sql 
     sql = 'insert into table id values ({0});' 
     for i in self.data_to_deal: 
      self.cur.execute(sql.format(i)) 
      self.conn.commit() 

threads = [] 
data_list = [1,2,3,4,5] 

for i in range(Num_Of_threads): 
    conn = MySQLdb.connect(host='localhost',user='root',passwd='',db='') 
    cur = conn.cursor() 
    new_thread = myThread(conn, cur, data_list[i]) 

for th in threads: 
    th.start() 

for t in threads: 
    t.join() 
+0

Xin lỗi vì trả lời trễ của tôi. Đề cập đến ví dụ của bạn ở trên tôi có lớp của tôi và kịch bản chính của tôi trong hai tập tin khác nhau. Đây không phải là một vấn đề tôi đoán. Một điều khác mà tôi làm khác đi là tôi không chuyển data_list của mình vào luồng của mình vì tôi cần chuỗi của mình để truy vấn dữ liệu từ cơ sở dữ liệu của tôi khi đang di chuyển. Vì vậy, những gì tôi làm là: 1.) Mở một kết nối cơ sở dữ liệu (kịch bản chính) 2.) Truy vấn hồ sơ (kịch bản chính) 3.) Bắt đầu như nhiều lớp dụ như nhiều hồ sơ tôi có (kịch bản chính) 4.) Cố gắng cập nhật một bản ghi bảng trong DB từ mỗi cá thể (cá thể lớp) – g0m3z

1

Dường như mysql 5.7 hỗ trợ đa luồng.

Như bạn đã thử trước đó - hãy đảm bảo truyền kết nối trong nhân viên def(). xác định các kết nối toàn cầu được sai lầm của tôi

Dưới đây là mẫu mã mà in 10 hồ sơ qua 5 bài, 5 lần

import MySQLdb 
import threading 


def write_good_proxies():  
    local_db = MySQLdb.connect("localhost","username","PassW","DB", port=3306) 
    local_cursor = local_db.cursor (MySQLdb.cursors.DictCursor) 
    sql_select = 'select http from zproxies where update_time is null order by rand() limit 10' 
    local_cursor.execute(sql_select) 
    records = local_cursor.fetchall() 
    id_list = [f['http'] for f in records] 
    print id_list 
def worker(): 
    x=0 
    while x< 5: 
     x = x+1 
     write_good_proxies() 

threads = [] 


for i in range(5): 
    print i 
    t = threading.Thread(target=worker) 
    threads.append(t) 
    t.start() 
Các vấn đề liên quan