чтение потока, сделанного urllib2 никогда, не восстанавливается, когда соединение было прервано

Простой ответ на ваш вопрос - нет, такого API нет. Большинство современных ГХ спроектированы с учетом «гипотезы поколений», что большинство объектов умирают молодыми или живут долго. То, что вы описываете, обычно называют «кризисом среднего возраста» - объекты, живущие достаточно долго, чтобы перейти в старшее поколение, но сразу же больше не нужны. Это, очевидно, далеко не оптимально для современных ГХ. Обычный способ избежать этого состоит в том, чтобы: уменьшить распределение (меньше шансов быть продвинутым, поэтому мы часто остаемся в «умершей молодой» части) или повторно использовать объекты (таким образом, мы приземляемся в «живой длинной» части).

Путем интенсивного повторного использования структур и ссылок вы выбрали первый подход. Вы также можете подумать о повторном использовании объектов путем объединения, например, ArrayPool или других.

Что касается вопросов, вы предлагаете API для:

«сборщик мусора может ответить, перемещая объект в кучу gen 0»

blockquote>

Хотя это касается Возможных деталей реализации очень много, вряд ли можно представить, чтобы реализовать это эффективно. Многие GC, в том числе .NET, стараются изо всех сил не копировать / перемещать память. Поколения - это просто логические области памяти, границы которых перемещаются взад и вперед. Таким образом, «перемещение объекта в gen0» потребует его копирования (и, возможно, всего его сохраненного графа, чтобы сделать его разумным), что приведет к накладным расходам, значительно превышающим потенциальную выгоду. Что еще хуже, в настоящее время это может быть сделано только во время GC, поскольку у нас не реализовано одновременное сжатие (в общем, движущиеся объекты, пока они используются).

«Насколько я понимаю, .NET Framework плохо оптимизирован для любых структур, кроме небольшого количества байтов (официальные источники говорят 16, хотя я слышал 24), а также для изменяемых структур»

blockquote>

Это похоже на маленькую ложь. Среда выполнения .NET значительно оптимизирует использование структур, и если вы передаете их по ref, это один из наиболее эффективных подходов, которые я могу придумать. Просто имейте в виду только ловушку защитного копирования , с которой вы можете столкнуться при использовании параметров in.

8
задан Martin 1 May 2009 в 14:02
поделиться

2 ответа

Попробуйте что-то вроде:

import socket
socket.setdefaulttimeout(5.0)
   ...
try:
   ...
except socket.timeout:
   (it timed out, retry)
7
ответ дан 5 December 2019 в 19:02
поделиться

Good question, I would be really interested in finding an answer. The only workaround I could think of is using the signal trick explained in python docs. In your case it will be more like:

import signal
import urllib2

def read(url):
    stream = urllib2.urlopen(url)
    return stream.read()

def handler(signum, frame):
    raise IOError("The page is taking too long to read")

# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)

# This read() may hang indefinitely
try:
    output = read('http://www.google.de/images/nav_logo4.png')
except IOError:
    # try to read again or print an error
    pass

signal.alarm(0)          # Disable the alarm
2
ответ дан 5 December 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: