Проблемы с потоком и динамическим списком в Python

Я постараюсь быть ясным, надеясь, что все понимают, даже если мне будет нелегко. Я новичок в программировании на Python, поэтому любая помощь будет приятной! У меня есть импорт этих библиотек: запросы и потоки. Я пытаюсь отправить параллельно несколько URL-адресов, чтобы сократить время отправки данных. Я использовал динамический список для суммирования всех URL-адресов, а затем использовал их для отправки.

l=[]
        if ALARM&1:
            alarmType="Break Alarm"
            AlarmNumber = 1
            sendAlarm(alarmType, AlarmNumber)
            print alarmType
        else:
            s = "https://..." #the url works 
            l.append(threading.Thread(target=requests.post, args=(s)))
        if ALARM&2:
            alarmType=0
        if ALARM&4:
            alarmType="Limit Switch"
            AlarmNumber = 2
            sendAlarm(alarmType, AlarmNumber)
            print alarmType
        else:
            s="https://..." 
            l.append(threading.Thread(target=requests.post, args=(s)))

        for t in l:
            t.start()
        for t in l:
            t.join()

Ошибка, которую я получил:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
TypeError: post() takes at most 3 arguments (110 given)

И то же самое для Thread-2, я спросил вокруг меня, но мы не можем найти решение. Если у кого-то есть идея? Спасибо!

1 ответ

Решение

Из документов args должен быть кортежем.

учебный класс threading.Thread(группа = Нет, цель = Нет, имя = Нет, args = (), kwargs = {})

args - кортеж аргумента для целевого вызова. По умолчанию ().

Вам нужно пройти args кортеж с URL-адресом в качестве первого (и единственного) элемента:

l.append(threading.Thread(target=requests.post, args=(s,)))

Кажущаяся бесполезной запятая здесь - это то, что заставляет Pyhton интерпретировать (s,) как множество, а не просто строку, окруженную ненужными скобками.

В противном случае вы в основном передаете строку, и Thread перебирает его, проходя post каждая буква в качестве отдельного аргумента, отсюда и сообщение об ошибке:

TypeError: post() takes at most 3 arguments (110 given)

Строка, интерпретируемая как итератор, является распространенной ошибкой. Функция / метод ожидает список / набор, и когда предоставлена ​​строка как "https://...", это относится к этому как ['"', 'h', 't', 't', 'p', 's', ':', '/', '/',...],

Коренная причина проблемы, так или иначе, анекдотична. Интересно, что хотя я ничего не знал о Thread при прочтении вопроса появляется сообщение об ошибке (TypeError: post() takes at most 3 arguments (110 given)) сразу указал мне правильное направление.

Другие вопросы по тегам