Из ответа Димы Кудоша и на основе https://stackoverflow.com/a/5700744/2240489 мне пришлось сделать следующее: я удалил ссылку на PARTITION BY
в sql и заменил с результатом ORDER BY
.
AModel.objects.annotate(
cumsum=Func(
Sum('a_number'),
template='%(expressions)s OVER (ORDER BY %(order_by)s)',
order_by="id"
)
).values('id', 'cumsum').order_by('id', 'cumsum')
Это дает следующий sql:
SELECT "amodel"."id",
SUM("amodel"."a_number")
OVER (ORDER BY id) AS "cumsum"
FROM "amodel"
GROUP BY "amodel"."id"
ORDER BY "amodel"."id" ASC, "cumsum" ASC
Ответ Димы Кудоша не суммировал результаты, но это было сделано выше.
Вы также можете подумать о том, чтобы сделать ваш канал неблокируемым и просто использовать System.currentTimeMillis ().
Если вы знакомы с использованием Java Selector, вы можете эмулировать тайм-аут сокета самостоятельно с помощью селектора. Полезно видеть sun.nio.ch.SocketAdaptor.
Следует соблюдать осторожность при использовании Thread.interrupt (). SocketChannel - прерыватель канала. Когда вы читаете описание InterruptibleChannel, Thread.interrupt () вызывает закрытие SocketChannel. Если вы хотите использовать SocketChannel после таймаута, вы не можете использовать функцию InterruptibleChannel.
В соответствии с этой статьей SocketChannel не будет таймаутом для своей операции чтения, но вы можете получить этот эффект от чтения из канала по-другому.
SocketChannel socketChannel;
socketChannel.socket().setSocketTimeout(500);
InputStream inStream = socketChannel.socket().getInputStream();
ReadableByteChannel wrappedChannel = Channels.newChannel(inStream);
чтение из wrappedChannel будет тайм-аут в соответствии с параметром socketTimeOut, который вы установили.