Python中的多线程和多进程

Python中存在多线程,但是很遗憾,python仅仅只支持一个线程的运行。

主要原因是,thread不支持守护线程。当主线程退出时,所有的子线程不管它们是否还在工作,都会被强行退出。有时我们并不希望发生这种行为,这时就引入了守护线程的概念。threading模块支持守护线程。

用multiprocessing替代Thread库

multiprocessing库的出现很大程度上是为了弥补thread库因为GIL低效的缺陷。它完整的复制了一套thread所提供的接口方便迁移。唯一的不同就是它使用了多进程而不是多线程。每个进程有自己的独立的GIL,完全并行,无GIL的限制(进程中包括线程),可充分利用多CPU多核的环境,因此也不会出现进程之间的GIL争抢。

python多进程并发,模块名称:multiprocessing

python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。

借助这个包,可以轻松完成从单进程到并发执行的转换

导入方式:import multiprocessing

multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该Process对象与Thread对象的用法相同,也有start(),run(),join()等方法。

此外multiprocessiong包中也有Lock/Event/Semaphore/Conditong类(这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的Thread类一致。所以,multiporcessing的很大一部分与threading使用同一套API,只不过换到了多进程的情景。

multiprocessing提供了threading包中没有的IPC(比如Pipe和Queue),效率上更高。应优先考虑Pipe和Queue,便面使用Lock/Event/Semaphore/Condition等同步方式(因为它们占据的不是用户进程的资源,而是线程)。

创建进程的类:Process()

方法:is_alive()、join([timeout])、run()、start()。其中,Process以start()启动某个进程。

创建函数并作为进程

创建函数并将其作为单进程

创建函数并将其作为多个进程

将进程定义为类。

import time
import multiprocessing
class ClockProcess(multiprocessing.Process):
    def __init__(self,interval):
        multiprocessing.Process.__init__(self)
        self.interval = interval
    def run(self):
        n = 5
        while n>0:
            print("the time is {0}".format(time.ctime()))
            time.sleep(self.interval)
            n -=1

if __name__ == '__main__':
    p = ClockProcess(3)
    p.start()

多进程的几种方法

Lock:可以避免访问资源时的冲突

Pool:可以提供指定数量的进程。

Queue:多进程安全的队列,实现多进程之间的数据传递

Pipe:实现管道模式下的消息发送与接受

Lock

同步与异步

同步执行:一个进程在执行任务时,另一个进程必须等待执行完毕,才能继续执行,加锁可以保证多个进程修改同一块数据时,同一时间只能由一个任务可以进行修改,没错,速度是慢了,但牺牲了速度却保证了数据安全。

异步执行:一个进程在执行任务时,另一个进程无需等待其执行完毕就可以执行,当有消息返回时,系统会提醒后者进行处理,这样会很好的提高运行效率。

import multiprocessing

def worker_with(lock,f):
    with lock:
        fs = open(f,'a+')
        n = 10
        while n>1:
            fs.write('Locked acquired via with\n')
            n -=1
        fs.close()
def worker_no_with(lock,f):
    lock.acquire()
    try:
        fs = open(f,'a+')
        n = 10
        while n>1:
            fs.write("lock acquired directly\n")
            n -= 1
        fs.close()
    finally:
        lock.release()
if __name__ == '__main__':
    lock = multiprocessing.Lock()
    f = 'file.txt'
    w = multiprocessing.Process(target= worker_with,args=(lock,f))
    nw = multiprocessing.Process(target=worker_no_with,args = (lock,f))
    w.start()
    nw.start()
    print('end')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值