Nên dùng CSDL nào khi chạy multithread Python

Hiện tại em đang dùng sqlite3. Script của e chạy 50 luồng treo liên tục, và có gọi đến 1 function để insert như hình. E thấy chạy khá chậm, tìm mới biết sqlite3 write data in multithread bị “Database is locked”, em có thử vài solution và áp dụng như trong ảnh:
thêm timeout=5, isolation_level=None,check_same_thread=False khi connect,
execute ‘pragma journal_mode=wal2;’

và thấy ổn hơn chút, nhưng vẫn khá chậm cho việc insert data, còn select thì rấ nhanh. liệu có cách nào hoặc dùng loại sql khác tốt hơn sqlite3 khi dùng multithread k ạ. hiện tại file của e cứ mỗi lần cần xử lý với db là đều fai connect, xong rồi close

nếu bạn muốn tìm giải pháp, thì đầu tiên, bạn cần xác định nguyên nhân

  1. lý do gì phải chạy 50 luồng
  2. lý do gì lại chọn sqlite

bạn cần insert bao nhiêu data mà phải dùng đến 50 luồng?
vì sao bạn không dùng 1 luồng insert tuần tự?
test chơi cho vui?

10 Likes

có thể xài cái này https://pypi.org/project/sqlite3worker/ tạo 1 sql_worker rồi share nó với 50 threads :V

6 Likes

Bạn có thể sài PostgreSQL, defaul 100 connection thì phải. Mà 100 cũng hơi ít, mình cũng đang kiếm cách tăng.

3 Likes
  1. vì e cần nhanh nên phải chạy nhiều luồng vậy ạ, thậm chí nhiều hơn.
  2. vì e thấy sqlite đơn giản, chỉ có 1 file .db nên muốn copy đi đâu tiện, và cũng nhanh mỗi tội khi insert multithread thì nó lại bị lock.

e cần nhanh nên phải chạy nhiều luồng, 1 ngày insert vài triệu -> nếu nhiều thì chục triệu dòng

là chỉ cần tạo 1 connect trên đầu file, rồi những function khác dùng chung luôn dc k cần fai tạo lại connect mới ạ

tốc độ của nó vs sqlite sao ạ, vì file script này e dùng để xử lý nhiều dữ liệu liên tục.

1 Like

chắc gì nhiều luồng sẽ nhanh hơn?

đây là bài tập, hay production hay là gì mà mỗi ngày lên tới vài triệu?
1 ngày có 86400, vài triệu nghĩa là có vài chục transaction/s?

8 Likes

Mình cũng có chung băn khoăn với bạn @kisuluoibieng
Dường như đang có sự hiểu sai về hỗ trợ đa luồng/ đa tiến trình với thực hiện nhiều kết nối cùng lúc. Về mặt lý thuyết mà nói, 50 chiếc xe 5 chỗ chạy cùng lúc chưa chắc chở hàng tốt hơn 10 chiếc container. Cho nên, việc xử lý “muốn nhanh” kia phải ở cấp độ phần cứng hỗ trợ tốt, ví dụ server có 8U, 16U, 128U trước rồi mới tính tiếp. Còn bình thường, server không hỗ trợ thì có ép nó chạy nhiều, giống như một đứa làm việc này được 2 giây, tạm ngừng, chạy sang làm việc khác rồi quay trở lại việc trước => hoàn toàn không có cái gọi là “nhanh hơn”.

8 Likes

Vậy trường hợp 2 server cùng CPU, giống RAM, … 2 phần cứng y như nhau. Thì app lập trình đa luồng nhanh hơn khi app đó được lập trình để chạy đơn luồng phải không bác?

4 Likes

Nhiều server và lập trình đa luồng/ đa xử lý thì là việc khác nhé. Khi một ứng dụng chạy trên nhiều server (sử dụng tài nguyên là CPU chứ không phải dùng ổ cứng/ RAM như kiểu máy tính load balancing thông dụng) liên quan đến grid computing. Lúc này, cần nhận biết rằng không phải bài toán nào cũng có thể áp dụng grid computing được.

Ở đây, chúng ta chỉ xét một server có nhiều bộ vi xử lý, thường hay được dùng từ “core” để chỉ. Nếu phần mềm lập trình bình thường, ta không áp dụng lập trình theo kiểu parallel processing thì phần mềm đó chỉ sử dụng có 1 hoặc vài core mà không tận dụng hết sức mạnh của các core còn lại. Một vấn đề cần lưu tâm: lập trình parallel processing sẽ khó/ phức tạp hơn viết phần mềm bình thường nên không phải lập trình viên nào cũng quan tâm đến việc đó trừ khi bài toán họ cần giải quyết cần sức mạnh của nhiều core.

7 Likes

cái này e chắc chắn sẽ nhanh hơn là 1 luồng nhé. vấn đề hiện tại chỉ là nhiều luồng thì sqltite nó lại k hỗ trợ insert ý ak

vps của e khi chạy script đó thì cpu trung bình 40-60% thôi ak. nên phần cứng có lẽ ko phải là vấn đề nữa


có lẽ vậy, chứ script của e mà chạy 1 luồng thì đúng là đến mùa quýt mới xử lý xong các đơn trong ngày

cpu của bạn, có mạnh tới đâu đi chăng nữa, nhưng đồng đội của nó quá yếu, thì nó cũng không thể phát huy tác dụng

và còn rất nhiêu thứ khác để kết luận, tốc độ không tỉ lệ thuận với sức mạnh của cpu

5 Likes

A post was split to a new topic: Nodejs có đa luồng không? Hiệu năng của đa luồng nodejs với đa luồng python thì bên nào hơn?

@Duy_Hoang98 Bạn muốn hỏi thì nodejs thì phải qua topic mới nhé. Bạn có thể inbox riêng cho bạn @kisuluoibieng nếu muốn nhờ thuê làm gì đó.

Vì Discourse không có chức năng duplicate comment nên mình đành move comment của bạn sang topic mới :sweat:

Mình nghĩ nghẽn ở đây là do cái sqlite :kissing:

2 Likes

là sao a. e đang dùng sqlite ko dùng mysql á

Thử sử dụng MySQL hoặc DB2 của IBM vì sqlite có nói “doesn’t support concurrency”.

3 Likes

SQLite được thiết kế để làm local storage cậu ạ :smile: Nó không được thiết kế chịu traffic đồng thời từ các luồng khác nhau đâu.

Như @kisuluoibieng có nói:

chắc gì nhiều luồng sẽ nhanh hơn?

Cậu cần hiểu bottleneck trong TH của cậu là database (khi insert DB của cậu bị lock, để đảm bảo ACID). Nhiều luồng trong TH của cậu không nhanh, trái lại còn chậm đi rõ rệt, do thời gian chờ tăng lên.
Cậu nên cân nhắc đổi sang hệ quản trị cơ sở dữ liệu khác, hoặc thậm chí NoSQL nếu như cậu không cần transaction và không nặng nề data consistency (đặc biệt, trong TH cậu có heavy insert như này). Cậu cũng nên cân nhắc dùng bulk insert thay vì insert từng dòng một (nôm na là cậu gom vài chục câu insert thành 1. Cách này cũng sẽ giúp được cậu nếu cậu không có lựa chọn đổi database. Cơ mà cài đặt sẽ hơi rắc rối chút).

Hope it helps!

See also:
https://www.sqlite.org/whentouse.html

11 Likes

Hiểu bài toán để biết nên dùng đa luồng hay không và dùng bao nhiêu luồng thì hợp lý.
VD: bài toán của bạn cần tính toán nhiều sau đó mới lưu vào db thôi rõ ràng đa luồng sẽ có ích. Tuy nhiên bao nhiêu luồng cũng cần cân nhắc, CPU chỉ 1 nhân nhưng set 50 luồng thì rõ ràng không phải là ý hay

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?