\ Maintain the number of workers by spawning or killing as required.
(self)
| 653 | raise |
| 654 | |
| 655 | def manage_workers(self): |
| 656 | """\ |
| 657 | Maintain the number of workers by spawning or killing |
| 658 | as required. |
| 659 | """ |
| 660 | if len(self.WORKERS) < self.num_workers: |
| 661 | self.spawn_workers() |
| 662 | |
| 663 | workers = self.WORKERS.items() |
| 664 | workers = sorted(workers, key=lambda w: w[1].age) |
| 665 | while len(workers) > self.num_workers: |
| 666 | (pid, _) = workers.pop(0) |
| 667 | self.kill_worker(pid, signal.SIGTERM) |
| 668 | |
| 669 | active_worker_count = len(workers) |
| 670 | if self._last_logged_active_worker_count != active_worker_count: |
| 671 | self._last_logged_active_worker_count = active_worker_count |
| 672 | self.log.debug("{0} workers".format(active_worker_count), |
| 673 | extra={"metric": "gunicorn.workers", |
| 674 | "value": active_worker_count, |
| 675 | "mtype": "gauge"}) |
| 676 | |
| 677 | if self.cfg.enable_backlog_metric: |
| 678 | backlog = sum(sock.get_backlog() or 0 |
| 679 | for sock in self.LISTENERS) |
| 680 | |
| 681 | if backlog >= 0: |
| 682 | self.log.debug("socket backlog: {0}".format(backlog), |
| 683 | extra={"metric": "gunicorn.backlog", |
| 684 | "value": backlog, |
| 685 | "mtype": "histogram"}) |
| 686 | |
| 687 | def spawn_worker(self): |
| 688 | self.worker_age += 1 |
no test coverage detected