\ Kill a worker :attr pid: int, worker pid :attr sig: `signal.SIG*` value
(self, pid, sig)
| 758 | self.kill_worker(pid, sig) |
| 759 | |
| 760 | def kill_worker(self, pid, sig): |
| 761 | """\ |
| 762 | Kill a worker |
| 763 | |
| 764 | :attr pid: int, worker pid |
| 765 | :attr sig: `signal.SIG*` value |
| 766 | """ |
| 767 | try: |
| 768 | os.kill(pid, sig) |
| 769 | # Track kills only on SIGTERM/SIGKILL (actual termination signals) |
| 770 | if sig in (signal.SIGTERM, signal.SIGKILL): |
| 771 | self._stats['workers_killed'] += 1 |
| 772 | except OSError as e: |
| 773 | if e.errno == errno.ESRCH: |
| 774 | try: |
| 775 | worker = self.WORKERS.pop(pid) |
| 776 | worker.tmp.close() |
| 777 | self.cfg.worker_exit(self, worker) |
| 778 | return |
| 779 | except (KeyError, OSError): |
| 780 | return |
| 781 | raise |
| 782 | |
| 783 | # ========================================================================= |
| 784 | # Dirty Arbiter Management |