Причина using
оператор должен гарантировать, что объект расположен, как только это выходит из объема, и это не требует, чтобы явный код гарантировал, что это происходит.
Как в Понимание оператора 'использования' в C#, CLR.NET преобразовывает
using (MyResource myRes = new MyResource())
{
myRes.DoSomething();
}
к
{ // Limits scope of myRes
MyResource myRes= new MyResource();
try
{
myRes.DoSomething();
}
finally
{
// Check for a null resource.
if (myRes != null)
// Call the object's Dispose method.
((IDisposable)myRes).Dispose();
}
}
Ошибка «не удается запустить новый поток» почти наверняка из-за того, что в вашем процессе python уже запущено слишком много потоков, и из-за некоторого ограничения ресурсов запрос на создание нового потока отклонен.
Вероятно, вам следует посмотреть количество создаваемых вами потоков; максимальное число, которое вы сможете создать, будет определяться вашей средой, но оно должно быть не менее сотен.
Вероятно, было бы неплохо переосмыслить вашу архитектуру здесь; видя, как это в любом случае выполняется асинхронно, возможно, вы могли бы использовать пул потоков для извлечения ресурсов с другого сайта вместо того, чтобы всегда запускать поток для каждого запроса.
Еще одно улучшение, которое следует учитывать, - это использование Thread.join и Thread. стоп;
Вы запускаете больше потоков, чем может обработать ваша система. Существует ограничение на количество потоков, которые могут быть активны для одного процесса.
Ваше приложение запускает потоки быстрее, чем потоки выполняются до завершения.
Я думаю, что лучший способ в вашем случае - установить тайм-аут сокета вместо порождения потока:
h = httplib.HTTPSConnection(self.config['server'],
timeout=self.config['timeout'])
Также вы можете установить глобальный тайм-аут по умолчанию с помощью socket.setdefaulttimeout ()
функция.
Обновление : См. ответы на Есть ли способ убить поток в Python? Вопрос (есть несколько довольно информативных), чтобы понять, почему. Thread .__ stop ()
не завершает поток, а скорее устанавливает внутренний флаг, так что он считается уже остановленным.
I completely rewrite code from httplib to pycurl.
c = pycurl.Curl()
c.setopt(pycurl.FOLLOWLOCATION, 1)
c.setopt(pycurl.MAXREDIRS, 5)
c.setopt(pycurl.CONNECTTIMEOUT, CONNECTION_TIMEOUT)
c.setopt(pycurl.TIMEOUT, COOPERATION_TIMEOUT)
c.setopt(pycurl.NOSIGNAL, 1)
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.SSL_VERIFYHOST, 0)
c.setopt(pycurl.SSL_VERIFYPEER, 0)
c.setopt(pycurl.URL, "https://"+server+path)
c.setopt(pycurl.POSTFIELDS,sended_data)
b = StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.perform()
something like that.
And I testing it now. Thanks all of you for help.
Если вы связываете время ожидания, почему бы вам не использовать urllib2 .