Helenr
您需要在多线程代码中进行一些可靠的并发控制,您需要确保按顺序发生一些事情:您需要确保队列不会再次读取列表,直到线程从队列中插入的第一轮中清除为止。pip您需要确保线程不会同时改变相同的元素,这将导致其中一个线程引发异常,即它无法删除已删除的元素。你可以利用 在多线程程序的流上放置一些控制,让我们声明一个名为 的事件,Queue 将等待这个事件得到满足,以便它开始其第二次迭代,以查询列表的所有元素。该事件将在成功从列表中删除 pip 后由您的一个线程设置。Eventfirst_iteration_processsed代码示例:import requests, threading, random, string, json, time, queue, refrom threading import Eventnum_worker_threads = int(input("Threads: "))lista = ['asd', 'asdjk', 'pip', 'lasd', 'lol']print(str(lista))iteration_processsed = Event()iteration_processsed.set()def do_work(i): # global lista try: print(i.strip()) print(str(lista)) if i == "pip": lista.remove("pip") print("Removed pip successfully") if i == "iter_end": iteration_processsed.set() except Exception as e: print(e)def worker(): while True: item = q.get() if item is not None: do_work(item) q.task_done()q = queue.Queue()threads = []for i in range(num_worker_threads): t = threading.Thread(target=worker) t.start() threads.append(t)for i in range(3): # I have only put 2 cycles iteration_processsed.wait() print(f"Iteration {i} started") iteration_processsed.clear() for line in lista: q.put(line) q.put('iter_end')q.join()for i in range(num_worker_threads): q.put(None)for t in threads: t.join()让我们试试这个:Threads: 2['asd', 'asdjk', 'pip', 'lasd', 'lol']Iteration 0 startedasd['asd', 'asdjk', 'pip', 'lasd', 'lol']asdjk['asd', 'asdjk', 'pip', 'lasd', 'lol']pip['asd', 'asdjk', 'pip', 'lasd', 'lol']Removed pip successfullylasd['asd', 'asdjk', 'lasd', 'lol']loliter_end['asd', 'asdjk', 'lasd', 'lol']['asd', 'asdjk', 'lasd', 'lol']Iteration 1 startedasdasdjk['asd', 'asdjk', 'lasd', 'lol']['asd', 'asdjk', 'lasd', 'lol']lasdlol['asd', 'asdjk', 'lasd', 'lol']['asd', 'asdjk', 'lasd', 'lol']iter_end['asd', 'asdjk', 'lasd', 'lol']Iteration 2 startedasdasdjk['asd', 'asdjk', 'lasd', 'lol']['asd', 'asdjk', 'lasd', 'lol']lasdlol['asd', 'asdjk', 'lasd', 'lol']['asd', 'asdjk', 'lasd', 'lol']iter_end['asd', 'asdjk', 'lasd', 'lol']现在,正如你所看到的,在删除pip之前,第二次迭代永远不会开始,当然,这里的实现离子非常特定于这种情况,但我想你可以把它调整到你自己的更一般的目的,也许添加更多事件来锁定更多的操作,以按照某种预定义的顺序执行。您可以从文档中阅读有关事件的更多信息,或者本文是一个良好的开端,https://www.bogotobogo.com/python/Multithread/python_multithreading_Event_Objects_between_Threads.php