python 中的线程和动态列表问题
Issues with thread and dynamic list in python
我会尽量说清楚,希望大家能理解,虽然这对我来说并不容易。
我是 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 也是一样,我问了周围的人,但我们找不到解决方案。如果有人有想法?谢谢!
从docs开始,args应该是一个元组。
class threading.Thread
(group=None, target=None, name=None, args=(), kwargs={})
args is the argument tuple for the target invocation. Defaults to ().
您需要传递 args
一个以 url 作为第一个(也是唯一一个)元素的元组:
l.append(threading.Thread(target=requests.post, args=(s,)))
这里看似无用的逗号让 Pyhton 将 (s,) 解释为一个集合,而不仅仅是一个被不必要的括号包围的字符串。
如果不这样做,您基本上是在传递一个字符串,Thread
对其进行迭代,将 post
每个字母作为单独的参数传递,因此出现错误消息:
TypeError: post() takes at most 3 arguments (110 given)
将字符串解释为迭代器是一个常见的陷阱。 function/method 需要 list/set,当提供像 "https://..."
这样的字符串时,它会像 ['"', 'h', 't', 't', 'p', 's', ':', '/', '/',...]
.
一样对待它
这个问题的根本原因是轶事,不知何故。这里有趣的是,虽然我在阅读问题时对 Thread
一无所知,但错误消息 (TypeError: post() takes at most 3 arguments (110 given)
) 立即为我指明了正确的方向。
我会尽量说清楚,希望大家能理解,虽然这对我来说并不容易。 我是 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 也是一样,我问了周围的人,但我们找不到解决方案。如果有人有想法?谢谢!
从docs开始,args应该是一个元组。
class
threading.Thread
(group=None, target=None, name=None, args=(), kwargs={})args is the argument tuple for the target invocation. Defaults to ().
您需要传递 args
一个以 url 作为第一个(也是唯一一个)元素的元组:
l.append(threading.Thread(target=requests.post, args=(s,)))
这里看似无用的逗号让 Pyhton 将 (s,) 解释为一个集合,而不仅仅是一个被不必要的括号包围的字符串。
如果不这样做,您基本上是在传递一个字符串,Thread
对其进行迭代,将 post
每个字母作为单独的参数传递,因此出现错误消息:
TypeError: post() takes at most 3 arguments (110 given)
将字符串解释为迭代器是一个常见的陷阱。 function/method 需要 list/set,当提供像 "https://..."
这样的字符串时,它会像 ['"', 'h', 't', 't', 'p', 's', ':', '/', '/',...]
.
这个问题的根本原因是轶事,不知何故。这里有趣的是,虽然我在阅读问题时对 Thread
一无所知,但错误消息 (TypeError: post() takes at most 3 arguments (110 given)
) 立即为我指明了正确的方向。