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

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

50 thread nhưng thực chất CPU ví dụ laptop mình chỉ có 8 lõi, 16 luồng, tức là max 16 luồng, vậy 50 luồng lúc ấy CPU sẽ lập lịch phân bổ, vì vậy tổng thời gian tính toán chưa chắc nhanh bằng setup 16 luồng, hơn nữa python thực chất 50 luồng nhưng chỉ chạy có 1 luồng ở 1 thời điểm vì vậy nên người ta mới nói python chậm ở điểm đó, nên 50 luồng ko có tác dụng gì mấy.

3 Likes

e dùng thử mysql rồi nhưng nó báo lỗi đại loại là request nhiều quá nên timeout hay quá tải gì á. em cài xampp để chạy mysql :smile:

thanka để e tìm hiểu mongo db xem

1 Like

cpu hiện tại là max 16 luồng ạ. e đang dùng vps 8 core 18gb ram mà k biết nó bao nhiều luồng, nhưng taskmanager check chỉ 40-60% cpu

vậy bác setup 16 luồng là max, setup cao hơn ko giải quyết dc gì, kiểu gì, việc gì cũng làm dc 1 ít, nhưng ko xong dc cái gì

2 Likes

Còn phụ thuộc vào task dạng nào. CPU bound task như for loop đến 1 tỉ, thì cần CPU thực hiện nhiều nên set = số luồng của CPU là tốt nhất. Nhưng task IO bound như call API, FileIO thì số luồng có thể lớn hơn rất nhiều vì đa số CPU sẽ chơi khi đợi IO. Tuy nhiên IO bound sẽ vẫn có giới hạn về nhiều mặt như: số lượng IO vào disk, memory, context switch.

python đơn luồng nhưng vẫn xử lý đồng thời cho IO task https://docs.python.org/3/library/threading.html

1 Like

cái này e ko rõ nghe đâu, cái công việc i/o ở python là dùng lib bên thứ 3 nên ko được tốt và hiệu quả

2 Likes

đúng là nhiều luồng nhưng sức mạnh của cpu phải đáp ứng được thì mới thấy hiệu quả, e thử test tăng thêm luồng thì thực sự mỗi luồng chạy rất chậm, mặc dù check taskmanager chỉ chiếm khoảng 6-70% cpu . :laughing:

2 Likes

Giờ mới nhận ra à? Nếu không thế thì người ta cần quái gì phải có những server có nhiều core và nhiều U, hoặc ta cứ nghe thông số Xeon x1234, Xeon e4321, blah blah chi mà rắc rối. Nói chung là ngoài CPU thì còn có các tài nguyên khác của máy tính nữa (RAM, ổ cứng, PCI, mainboard), rồi kèm với giải thuật được viết tốt, chương trình dùng tài nguyên hợp lý => hiệu suất cao.

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