并发编程——线程与进程,开启线程的两种方式,多线程与多进程

1 线程和进程

1、线程是一个基本的CPU执行单元,也是程序执行流的最小单元。
2、进程是拥有资源的基本单位,线程是独立调度的基本单位。
3、每启动一个进程,里面至少有一个线程,线程不拥有资源,但可以访问隶属于进程的系统资源。
4、创建或撤销进程(系统要为其分配或回收内存空间和资源),进程的切换,开销远大于线程。
5、同一进程内的多个线程共享进程的地址空间,共享进程的资源,线程之间通信容易实现。
6、进程内的线程对于其他进程不可见。

2 开启线程的两种方式threading模块,与进程方法类似

2.1 方式一:

from threading import Thread
import time

def test(name):
    print('%s is running' % name)
    time.sleep(2)
    print('%s is done' % name)

if __name__ =='__main__':
    t1 = Thread(target=test,args=('小明',))
    t1.start()
    print('主')
    
# 小明 is running
# 主
# 小明 is done

2.2 方式二:

class MyTest(Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print('%s is running' % self.name)
        time.sleep(2)
        print('%s is done' % self.name)


if __name__ == '__main__':
    t1 = MyTest('小明')
    t1.start()
    print('主线程')


小明 is running
主线程
小明 is done

3 多线程与多进程的区别

3.1 进程开销大于线程

 def test():
    print('running')

if __name__ == '__main__':
    p1 = Process(target=test)
    p1.start()
    print('主进程')
    
# 主进程
# running
def test():
    print('running')


if __name__ == '__main__':
    t1 = Thread(target=test)
    t1.start()
    print('主线程')
    
# running
# 主线程

3.2 同一进程内的线程共享数据,进程之间数据隔离


def test():
    global n
    print('running')
    n = 0
    print('进程内:', n)


if __name__ == '__main__':
    n = 10
    p1 = Process(target=test)
    p1.start()
    p1.join()
    print('主进程:', n)
    
# running
# 进程内: 0
# 主进程: 10
def test():
    global n
    print('running')
    n = 0
    print('线程内:', n)


if __name__ == '__main__':
    n = 10
    t1 = Thread(target=test)
    t1.start()
    t1.join()
    print('主线程:', n)

# running
# 线程内: 0
# 主线程: 0

3.3 同一进程内线程pid一样,进程与进程的pid不一样

import os
import threading
import multiprocessing


def test():
    print('hello', '%s pid:' % threading.current_thread().getName(), os.getpid())


if __name__ == '__main__':
    t1 = Thread(target=test)
    t2 = Thread(target=test)
    t3 = Thread(target=test)
    t1.start()
    t2.start()
    t3.start()
    print('主线程:', os.getpid())
    
# hello Thread-1 pid: 26308
# hello Thread-2 pid: 26308
# hello Thread-3 pid: 26308
# 主线程: 26308
import os
import threading
import multiprocessing


def test():
    print('hello', '%s pid:' % multiprocessing.current_process().name, os.getpid())


if __name__ == '__main__':
    p1 = Process(target=test, name='p1')
    p2 = Process(target=test, name='p2')
    p3 = Process(target=test, name='p3')
    p1.start()
    p2.start()
    p3.start()
    print('主进程:', os.getpid())


# 主进程: 12516
# hello p1 pid: 46720
# hello p2 pid: 7540
# hello p3 pid: 29876
 

4 Thread对象其他属性或方法

Thread 对象的方法:

isAlive() :返回True or False 表示线程是否活动
getName():返回线程名
setName():设置线程名
join():等待线程运行结束

threading模块提供的方法:

threading.currentThead() :返回当前线程
threading.enumerate():返回正在运行的线程列表
threading.active_Count():返回正在运行的线程数

from threading import Thread, currentThread


def test():
    print('%s is running' % currentThread().getName())  # 打印当前线程名
    time.sleep(3)


if __name__ == '__main__':
    t1 = Thread(target=test)
    t2 = Thread(target=test)
    t1.start()
    t2.start()
    print(threading.enumerate())
    print(threading.active_count())
    print('主线程')

# Thread-1 is running
# Thread-2 is running
# [<_MainThread(MainThread, started 12992)>, <Thread(Thread-1, started 12680)>, <Thread(Thread-2, started 42892)>]
# 3
# 主线程
from threading import Thread, currentThread


def test():
    print('%s is running' % currentThread().getName())  # 打印当前线程名
    time.sleep(3)
    print('done')


if __name__ == '__main__':
    t1 = Thread(target=test)
    t1.setName('线程t1')
    t1.start()
    t1.join()
    print('主线程')
    
# 线程t1 is running
# done
# 主线程
def test():
    print('%s is running' % currentThread().getName())  # 打印当前线程名
    time.sleep(3)
    print('done')


if __name__ == '__main__':
    t1 = Thread(target=test)
    t1.start()
    print(t1.is_alive())
    print('主线程')
    
# Thread-1 is running
# True
# 主线程
# done
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值