python中线程和动态列表的问题

时间:2016-10-10 15:05:31

标签: python multithreading dynamic-list

我会尽量明确,希望每个人都能理解,即使这对我来说也不容易。 我是python编程的初学者,所以每个帮助都会很棒! 我已经将这些图书馆导入:请求和线程。 我试图发送并行的几个网址来减少数据的发送时间。我使用动态列表来堆叠所有网址,然后使用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,我问过我,但我们无法找到解决方案。如果有人有想法?谢谢!

1 个答案:

答案 0 :(得分:2)

docs开始,args应该是一个元组。

  

class threading.Thread(group = None,target = None,name = None,args =(),kwargs = {})

     

args是目标调用的参数元组。默认为()。

您需要将args元组作为第一个(也是唯一的)元素传递给元组:

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))却指出了我正确的方向。