多任务

进程是资源分配的最小单位,线程是CPU调度的最小单位。

一、进程

创建一个进程

from multiprocessing import Process
import time
def sing():
    for i in range(3):
        print("我在唱歌第{}句歌词".format(i+1))
        time.sleep(1)

def dance():
    for i in range(3):
        print("我在跳舞第{}段舞蹈".format(i+1))
        time.sleep(1)

if __name__ == '__main__':
    t1=Process(target=sing)
    t2=Process(target=dance)
    t1.start()
    t2.start()

输出结果为:
在这里插入图片描述
进程之间的通讯:

from multiprocessing import Process,Queue
import time
def producer(q):
    for i in range(3):
        bz="包子:%d"%(i+1)
        print("生产"+bz)
        q.put(bz)
        time.sleep(1)

def consumer(q):
    for i in range(3):
        bz=q.get()
        print("消费"+bz)

if __name__ == '__main__':
    q=Queue(3)
    p1=Process(target=producer,args=(q,))
    p2=Process(target=consumer,args=(q,))
    p1.start()
    p2.start()

输出结果为:
在这里插入图片描述
进程子类化:

from multiprocessing import Process,Queue
import time
class SubProcess(Process):
    def __init__(self,x,name):
        super().__init__()
        self.x=x
        self.name=name
    def run(self):
        for i in range(15):
            bz = self.name+"包子:%d" % (i + 1)
            print(bz)
            self.x.put(bz)
            time.sleep(1)
class SubProcess1(Process):
    def __init__(self,x,name):
        super().__init__()
        self.x=x
        self.name=name
    def run(self):
        for i in range(10):
            bz = self.name+"吃"+self.x.get()
            print(bz)

if __name__ == '__main__':
    q=Queue(40)
    zs=SubProcess(q,"张三")
    ls=SubProcess(q,"李四")
    ww=SubProcess1(q,"王五")
    zl=SubProcess1(q,"赵六")
    sq=SubProcess1(q,"孙七")
    zs.start()
    ls.start()
    ls.join()  # 堵塞主进程,直到子进程结束。
    ww.start()
    zl.start()
    sq.start()

进程池

from multiprocessing import  Pool
import time
def downLoad(movie):
    for i in range(5):
        print(movie,"下载进度%.2f%%"%((i+1)/5*100))
        time.sleep(1)
    return movie
def alter(name):
    print(name,"下载完毕")

if __name__ == '__main__':
    movies=['哪吒之魔童降世','速度与激情9','复仇者联盟5','变形金刚6']
    p=Pool(3)
    for movie in movies:
        p.apply_async(downLoad,(movie,),callback=alter)
    p.close()
    p.join()

二、线程

使用threading模块创建线程

from threading import Thread
import time,os
def sing():
    for i in range(10):
        print("唱歌{}".format(i+1),os.getpid())
        time.sleep(1)
def dance():
    for i in range(10):
        print("跳舞{}".format(i+1),os.getpid())
        time.sleep(1)
if __name__ == '__main__':
    t1=Thread(target=sing)
    t2=Thread(target=dance)
    t1.start()
    t2.start()

传递参数

from threading import Thread
import time
def get(num):
    for i in range(num):
        print(i)
        time.sleep(1)
if __name__ == '__main__':
    t1=Thread(target=get,args=(7,))
    t1.start()

join()方法

join()方法功能:当前线程执行完后其他线程才会继续执行。

setDaemon()方法

setDaemon()将当前线程设置为守护线程来守护主线程:
当主线程结束后,守护线程也就结束,不管是否执行完成。
注意:需要在子线程开启的时候设置为守护线程,否则无效。

threading模块提供的方法

threading.currentThread():返回当前的线程变量
threading.enumerate():返回一个包含正在运行的线程的列表。
threading.acticeCount():返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

使用继承方式开启线程。

import time
from threading import Thread
class Dance(Thread):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        for i in range(5):
            print(self.name,"跳舞{}".format(i+1))
            time.sleep(1)
class Sing(Thread):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        for i in range(5):
            print(self.name,"唱歌{}".format(i+1))
            time.sleep(1)
if __name__ == '__main__':
    d=Dance("司扬眉")
    s=Sing("董震")
    d.start()
    s.start()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值