【问题标题】:Python execute threads by orderPython按顺序执行线程
【发布时间】:2016-05-17 04:15:38
【问题描述】:

我有以下代码:

导入线程

def send_to_server(lst):
    #Some logic to send the list to the server.


while 1:
    lst = []
    for i in range(1000):
        lst.append(i)
    task = threading.Thread(target=send_to_server,args(copy(lst),))
    task.start()

我有几个问题:

1) 使用线程的想法是因为发送到服务器需要时间,我想继续
不停地生成数据。
此代码的问题在于,如果我创建了线程#3 并且它需要很长时间来处理,
到那时线程#4 将被启动。 我想确保每个列表都将由我创建的另一个列表发送到服务器,这意味着线程 #3 将在线程 #4 之前将数据发送到服务器。
我知道我需要使用队列,但我不知道具体如何。

2)我应该使用 lst 的副本吗?或者我也可以使用 lst,我不确定。

【问题讨论】:

  • 为什么要遍历range(1000)而不是直接使用:lst = range(1000)
  • @zondo idk 感谢您的建议。

标签: python multithreading operating-system thread-safety message-queue


【解决方案1】:

您想使用Queue,python 中的线程安全队列类。我想您想要一个线程将事物放入队列中,并希望有一个线程像这样依次对它们进行操作:

q = Queue.Queue()
t1 = threading.Thread(target=fill_q,args(q, lst))
t2 = threading.Thread(target=consume_q,args(q, lst))
t1.start()
t2.start()

def fill_q(q, lst):
    for elem in lst:
        q.put(elem)

def consume_q(q, lst):
    for i in range(len(lst)):
        send_to_server(q.get())

如果您对性能感兴趣,您可能想阅读 python 中的GIL,这里是https://wiki.python.org/moin/GlobalInterpreterLock

【讨论】:

  • 它看起来可能会起作用。 fill_q 将与无限循环一起工作,而 consume_q 只有在队列不为空时才会工作,如何有效地检查呢?另外,你能解释一下GIL吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多