在Python子进程中生成线程

5 投票
2 回答
3580 浏览
提问于 2025-04-16 10:11

我有一组60个对象,每个对象我都想给它创建一个独立的 threading.Thread。为了进一步简化这个过程,因为Python有一些锁定机制,我想使用子进程(通过 multiprocessing.Process),每个进程里使用6个 Threads。我把这些对象整理成一个二维 list,这样更方便循环处理,其中 obj[] 的索引代表 Process 的编号,而 obj[][] 中的每个元素就是我想用作 Threads 的对象。下面是我的具体做法:

# break the objects out into my 2D list
obj= []
for i in all_obj:
  if len(obj) == 0 or len(obj[len(obj)-1]) > 5:
    obj.append([])
  obj[len(obj)-1].append(i)

# spawn processes 
processes = []
for i in obj:
  processes.append(Process(target=proc_run,args=(i))
  processes[len(processes)-1].start()

# process target
def proc_run(my_objs):
  threads = []
  for ad in my_objs:
    threads.append(Thread(target=thread_run,args=(ad))
    threads[len(threads)-1].start()

# thread target
def thread_run(my_obj):
  for i in range(1,21):
    ## do some stuff with the object here
    pass
  logging.info("Thread for object <%s> finished."%(my_obj.prop))

问题是,线程实际上并没有被创建,除非我在 start() 调用后加上 join()。这样一来,我就无法实现多线程的目的(我可以直接用一个 for 循环来完成同样的事情),所以我有点不知道该怎么办。

我对线程的知识非常有限,所以如果你能把答案说得简单点,大家都会更容易理解。谢谢!

2 个回答

1

Process(在某些版本的 multiprocessing 中)会在 target 函数返回后立即结束这个进程(也就是所有的线程都会被杀掉)。为了确保在所有线程完成后再结束进程,你需要使用 join() 方法。不过,你应该把这个 join() 放在循环外面,这样可以在所有线程运行的时候等待它们完成。

3

因为Python基本上是通过线程来启动进程的,所以我决定使用60个进程。这应该能实现我想要的效果;只是会让任务管理器里的进程标签看起来有点多而已。 ;)

撰写回答