Linux python 多进程编程遇到的问题,请高手赐教

flyfire · 2018年05月05日 · 最后由 hellohell 回复于 2018年05月07日 · 1449 次阅读
import os,time,random

from  multiprocessing  import Process

PROCESS_MAX_NUM = 10

def get_num(number):
    print(number)
    time.sleep(10*random.random())



if __name__ == "__main__":    
    process_dict = {}
    for number in range(100):
        if len( process_dict.keys() ) < PROCESS_MAX_NUM:
            p =  Process( target=get_num, args=(number ,) )        
            p.start()
            process_dict[ p ]  =  time.time()
            continue

        while len( process_dict.keys() ) >= PROCESS_MAX_NUM :
            for p in list( process_dict.keys() ):
                current_time = time.time()
                if ( current_time - process_dict[p] )  > 5  and  p.is_alive():
                    print(p.name + " is terminate ")
                    p.terminate()
                    del process_dict[p]
                elif not p.is_alive():
                    del process_dict[p]
                else:
                    continue                
            time.sleep(1)

    if len( process_dict.keys() ) == 0:
        print("all task done")     

上面的程序运行时总是不会输出最后的打印信息,而且时不时的少数据,应该是打印出来 100 个网址的,但是实际上只打印出来了 60 多个数

请高手赐教,为啥会这样?

共收到 5 条回复 时间 点赞

换正常的生产者消费者模型

你现在把生产和消费都挂在生产的规则中
一旦生产完,直接就会忽略未消费完的任务

2 者要分离

不输出行为条件不匹配

另外,你这个用进程池不行么
超时的逻辑可以做在进程内

  • 楼上说的对
  • 那个 continue 有啥用,for 循环的最后一句

好建议,超时的逻辑确实可以做在进程内,谢啦

hellohell 回复

那个没啥用,只是占个位置,哈哈

flyfire 回复

还有如此骚操作😂

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册