Tôi làm việc trên lệnh manage.py tạo ra khoảng 200 luồng để kiểm tra máy chủ từ xa. Thiết lập cơ sở dữ liệu của tôi cho phép tôi sử dụng 120 kết nối, vì vậy tôi cần phải sử dụng một số loại tổng hợp. Tôi đã cố gắng sử dụng chủ đề tách ra, như thế nàySử dụng Django ORM trong chủ đề và tránh "quá nhiều khách hàng" ngoại lệ bằng cách sử dụng BoundedSemaphore
class Pool(Thread):
def __init__(self):
Thread.__init__(self)
self.semaphore = threading.BoundedSemaphore(10)
def give(self, trackers):
self.semaphore.acquire()
data = ... some ORM (not lazy, query triggered here) ...
self.semaphore.release()
return data
tôi vượt qua thể hiện của đối tượng này để mỗi thread check-nhưng vẫn nhận được "OperationalError: Fatal: xin lỗi, quá nhiều khách hàng đã" bên trong đối tượng Pool sau init-ing 120 chủ đề. Tôi đã dự kiến rằng chỉ có 10 kết nối cơ sở dữ liệu sẽ được mở và các chuỗi sẽ chờ khe semaphore miễn phí. Tôi có thể kiểm tra semaphore hoạt động bằng cách bình luận "phát hành()", trong trường hợp đó chỉ có 10 chủ đề sẽ làm việc và khác sẽ chờ cho đến khi chấm dứt ứng dụng.
Nhiều như tôi hiểu, mỗi chuỗi đang mở kết nối mới với cơ sở dữ liệu ngay cả khi cuộc gọi thực sự nằm trong chuỗi khác nhau, nhưng tại sao? Có cách nào để thực hiện tất cả các truy vấn cơ sở dữ liệu bên trong chỉ có một luồng không?
Để tìm sự cố DB thực tế, tôi đoán chúng tôi cần thêm mã sql. Nhưng, tại sao bạn không chỉ bơi toàn bộ chủ đề để bạn chỉ chạy khoảng 20-30 vào thời điểm đó? – KillianDS
Xin chào, vấn đề của tôi là django tạo kết nối cho mọi chuỗi liên lạc bất kỳ mã ORM nào, ngay cả khi thao tác ORM thực sự xảy ra trong chuỗi khác nhau. (Tôi đã kiểm tra nó bằng cách loại bỏ tất cả các mã từ các chủ đề khác, ngoại trừ các cuộc gọi đến trường hợp của hồ bơi cho). Vì vậy, trong trường hợp của tôi không có SQL ngoại trừ việc nhận dữ liệu trong cung cấp. Miễn là tôi có trình kiểm tra lớp (Chủ đề): def def (tự): self.getter.give (self.trackers) kết nối đang được tạo (trackers là danh sách chuỗi ở đây). Và sau khi đạt đến giới hạn 120 kết nối, cơ sở dữ liệu của tôi bắt đầu đưa ra ngoại lệ. – Riz
btw, tôi đã có thể giải quyết vấn đề này theo cách - bằng cách đóng kết nối theo cách thủ công sau mỗi yêu cầu db, hiệu suất là chấp nhận được, nhưng tôi vẫn tò mò về gốc của vấn đề này. – Riz