多线程与多进程方法对比

本文对比了多线程和多进程在将0-10000数字写入csv文件时的效率,通过代码实例展示了普通插入、进程池及多线程的方法。实验结果显示,进程池在CPU密集型任务上表现优秀,而多线程则更适合IO密集型任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程与多进程方法对比

多线程与多进程将0-10000数字写入csv文件,对花费时间进行对比
完成代码获取地址:https://download.youkuaiyun.com/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密集型操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值