ошибка: не может начать новую дискуссию

Причина 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();
    }
}

23
задан Oduvan 2 December 2009 в 18:36
поделиться

5 ответов

Ошибка «не удается запустить новый поток» почти наверняка из-за того, что в вашем процессе python уже запущено слишком много потоков, и из-за некоторого ограничения ресурсов запрос на создание нового потока отклонен.

Вероятно, вам следует посмотреть количество создаваемых вами потоков; максимальное число, которое вы сможете создать, будет определяться вашей средой, но оно должно быть не менее сотен.

Вероятно, было бы неплохо переосмыслить вашу архитектуру здесь; видя, как это в любом случае выполняется асинхронно, возможно, вы могли бы использовать пул потоков для извлечения ресурсов с другого сайта вместо того, чтобы всегда запускать поток для каждого запроса.

Еще одно улучшение, которое следует учитывать, - это использование Thread.join и Thread. стоп;

29
ответ дан 29 November 2019 в 01:38
поделиться

Вы запускаете больше потоков, чем может обработать ваша система. Существует ограничение на количество потоков, которые могут быть активны для одного процесса.

Ваше приложение запускает потоки быстрее, чем потоки выполняются до завершения.

9
ответ дан 29 November 2019 в 01:38
поделиться

Я думаю, что лучший способ в вашем случае - установить тайм-аут сокета вместо порождения потока:

h = httplib.HTTPSConnection(self.config['server'], 
                            timeout=self.config['timeout'])

Также вы можете установить глобальный тайм-аут по умолчанию с помощью socket.setdefaulttimeout () функция.

Обновление : См. ответы на Есть ли способ убить поток в Python? Вопрос (есть несколько довольно информативных), чтобы понять, почему. Thread .__ stop () не завершает поток, а скорее устанавливает внутренний флаг, так что он считается уже остановленным.

5
ответ дан 29 November 2019 в 01:38
поделиться

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.

4
ответ дан 29 November 2019 в 01:38
поделиться

Если вы связываете время ожидания, почему бы вам не использовать urllib2 .

3
ответ дан 29 November 2019 в 01:38
поделиться
Другие вопросы по тегам:

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