2012-10-12 32 views
5

Tôi đã đoạn mã sau đó tạo ra một HTTPConnectionPool sử dụng khuôn khổ TwistedMatrix Python, và một đại lý cho các yêu cầu HTTP:Số lượng tối đa của kết nối cho mỗi máy chủ với twisted.web.client.Agent

self.pool = HTTPConnectionPool(reactor, persistent=True) 
    self.pool.retryAutomatically = False 
    self.pool.maxPersistentPerHost = 1 
    self.agent = Agent(reactor, pool=self.pool) 

sau đó tôi có thể tạo yêu cầu kết nối đến một máy chủ địa phương:

d = self.agent.request(
     "GET", 
     url, 
     Headers({"Host": ["localhost:8333"]}), 
     None) 

vấn đề là: các máy chủ địa phương đôi khi cư xử không chính xác khi nhiều yêu cầu đồng thời được thực hiện, vì vậy tôi muốn giới hạn số lượng yêu cầu đồng thời để 1.

Yêu cầu bổ sung phải được xếp hàng đợi cho đến khi yêu cầu đang chờ xử lý hoàn tất.

Tôi đã thử với self.pool.maxPersistentPerHost = 1 nhưng không hoạt động.

Twisted.web.client.Không hỗ trợ HTTPConnectionPool giới hạn số lượng kết nối tối đa cho mỗi máy chủ, hoặc tôi có phải tự thực hiện hàng đợi FIFO yêu cầu không?

Trả lời

5

Lý do thiết maxPersistentPerHost-1 không giúp là maxPersistentPerHost là để kiểm soát số lượng tối đa kết nối liên tục để bộ nhớ cache mỗi máy chủ. Nó không ngăn các kết nối bổ sung được mở ra để phục vụ các yêu cầu mới, nó sẽ chỉ khiến chúng bị đóng ngay lập tức sau khi nhận được phản hồi, nếu đạt tới số lượng kết nối đã lưu trữ tối đa.

Bạn có thể thực thi tuần tự theo một số cách. Một cách để có "hàng đợi FIFO" là với twisted.internet.defer.DeferredLock. Sử dụng nó cùng với Agent như thế này:

lock = DeferredLock() 
d1 = lock.run(agent.request, url, ...) 
d2 = lock.run(agent.request, url, ...) 

Yêu cầu thứ hai sẽ không chạy cho đến sau lần đầu tiên được hoàn thành.

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