在Python中的子进程内生成一个线程

时间:2011-01-18 13:33:23

标签: python multithreading multiprocessing

我有一组60个对象,每个对象都有自己的threading.Thread。为了通过Python的锁定和诸如此类的方法进一步打破这一点,我希望产生子流程(使用multiprocessing.Process),并且每Threads使用6 Process。我将我的对象分解为二维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))

问题是线程实际上并没有产生,除非我在join()调用后添加start()。由于这消除了我对多线程的渴望(我可以使用for循环并完成同样的事情),我不完全确定该怎么做。

当谈到这种线程时,我是一个完全的菜鸟,所以你可以做出更多愚蠢的回答,对所有参与者来说都更容易。感谢。

2 个答案:

答案 0 :(得分:2)

由于Python基本上使用线程来生成进程,所以我决定使用60个进程。这应该(基本上)允许我的目标;它只会使任务管理器中的进程选项卡爆炸一点。 ;)

答案 1 :(得分:0)

Process(在multiprocessing的至少某些版本中)只要target函数返回就会终止进程(因此,所有线程)。您需要join()才能在线程完成后才能实现这一点,但是您将join()置于循环之外,以便等待,而它们都在运行。