在Python子进程中生成线程
我有一组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个进程。这应该能实现我想要的效果;只是会让任务管理器里的进程标签看起来有点多而已。 ;)