多线程与多进程方法对比

多线程与多进程方法对比

多线程与多进程将0-10000数字写入csv文件,对花费时间进行对比
完成代码获取地址:https://download.csdn.net/download/luzaofa/10908723
1、普通插入与进程池类比结果:

在这里插入图片描述

代码如下:

# Time    : 12/27/2018 9:53 AM
# Author  : Luzaofa

import time
import types
import copy_reg
import multiprocessing as mp


def _pickle_method(m):
    if m.im_self is None:
        return getattr, (m.im_class, m.im_func.func_name)
    else:
        return getattr, (m.im_self, m.im_func.func_name)


copy_reg.pickle(types.MethodType, _pickle_method)


class Demo(object):

    def __init__(self):
        pass

    def test(self, mass):
        '''信息写入文件'''
        with open('test.csv', 'a+') as f:
            f.writelines(str(mass) + '\n')

    def data_mp(self, func, mass):
        '''进程池'''
        pool = mp.Pool(processes=4)
        for i in mass:
            pool.apply_async(func, args=(i,))
        pool.close()
        pool.join()

    def pb_main(self):
        '''普通数据插入'''
        start = time.time()
        for i in range(10000):
            self.test(i)
        end = time.time()
        print('总用时间:%s' % (end - start))

    def mp_main(self):
        '''进程池插入'''
        start = time.time()
        self.data_mp(self.test, [i for i in range(10000)])
        end = time.time()
        print('总用时间:%s' % (end - start))


if __name__ == '__main__':
    demo = Demo()
    demo.pb_main()
    print '-----------------'
    demo.mp_main()

2、普通插入与多线程类比结果:

在这里插入图片描述

代码如下:

# Time    : 12/27/2018 9:53 AM
# Author  : Luzaofa

import time
import threading


class MyThread(threading.Thread):

    def __init__(self, func, args, name=''):
        threading.Thread.__init__(self)
        self.name = name
        self.func = func
        self.args = args

    def run(self):
        apply(self.func, self.args)


class Demo(object):

    def __init__(self):
        self.mass = [i for i in range(10000)]

    def test(self, mass):
        '''信息写入文件'''
        with open('test.csv', 'a+') as f:
            f.write(str(mass) + '\n')
            f.flush()

    def pb_main(self):
        '''普通数据插入'''
        start = time.time()
        for i in range(10000):
            self.test(i)
        end = time.time()
        print('总用时间:%s' % (end - start))

    def td_main(self):
        '''多线程'''
        start = time.time()
        threads = []
        for i in self.mass:
            t = MyThread(self.test, (i,), self.test.__name__)
            threads.append(t)
        for i in self.mass:
            threads[i].start()
        for i in self.mass:
            threads[i].join()
        end = time.time()
        print('总用时间:%s' % (end - start))


if __name__ == '__main__':
    demo = Demo()
    demo.pb_main()
    print '----------------------'
    demo.td_main()

结论:进程池适合cpu密集型操作、多线程适合于IO密集型操作

猜你喜欢

转载自blog.csdn.net/Luzaofa/article/details/86234114