1

我会尽量说清楚,希望每个人都能理解,即使这对我来说并不容易。我是python编码的初学者,所以每一个帮助都会很好!我有那些库导入:请求和线程。我正在尝试并行发送几个 url 以减少数据的发送时间。我使用动态列表来堆叠所有 url,然后使用 requests.post 发送它们。

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 也是如此,我在周围询问,但我们找不到解决方案。如果有人有想法?谢谢 !

4

1 回答 1

2

docs, 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)) 立即为我指明了正确的方向。

于 2016-10-10T15:15:23.853 回答