|
@@ -667,7 +667,7 @@ class AsynPool(_pool.Pool):
|
|
|
pass
|
|
|
self.on_inqueue_close = on_inqueue_close
|
|
|
|
|
|
- def schedule_writes(ready_fds, curindex=[0]):
|
|
|
+ def schedule_writes(ready_fds, total_write_count=[0]):
|
|
|
# Schedule write operation to ready file descriptor.
|
|
|
# The file descriptor is writeable, but that does not
|
|
|
# mean the process is currently reading from the socket.
|
|
@@ -675,17 +675,18 @@ class AsynPool(_pool.Pool):
|
|
|
# the buffer can accept at least 1 byte of data.
|
|
|
|
|
|
# This means we have to cycle between the ready fds.
|
|
|
- # the first version used shuffle, but using i % total
|
|
|
- # is about 30% faster with many processes. The latter
|
|
|
- # also shows more fairness in write stats when used with
|
|
|
- # many processes [XXX On OS X, this may vary depending
|
|
|
+ # the first version used shuffle, but this version
|
|
|
+ # using `total_writes % ready_fds` is about 30% faster
|
|
|
+ # with many processes, and also leans more towards fairness
|
|
|
+ # in write stats when used with many processes
|
|
|
+ # [XXX On OS X, this may vary depending
|
|
|
# on event loop implementation (i.e select vs epoll), so
|
|
|
# have to test further]
|
|
|
- total = len(ready_fds)
|
|
|
+ num_ready = len(ready_fds)
|
|
|
|
|
|
- for i in range(total):
|
|
|
- ready_fd = ready_fds[curindex[0] % total]
|
|
|
- curindex[0] += 1
|
|
|
+ for i in range(num_ready):
|
|
|
+ ready_fd = ready_fds[total_write_count[0] % num_ready]
|
|
|
+ total_write_count[0] += 1
|
|
|
if ready_fd in active_writes:
|
|
|
# already writing to this fd
|
|
|
continue
|