首页 > 其他分享 >线程

线程

时间:2023-02-22 20:35:36浏览次数:29  
标签:Thread t1 print 线程 进程 守护

线程和进程概念

进程:数据隔离,资源分配的最小单位,可以利用多核,操作系统调度,开启关闭切换时间消耗大
multiprocessing 如何开启进程 start join
进程有数据不安全问题Lock
进程之间可以通信ipc
队列(安全) 管道(不安全)
第三方工具
进程之间可以通过Manager类实现数据共享
一般情况下开启的进程数不会超过cpu个数的两倍



线程
能被操作系统调度(给CPU执行)的最小单位
同一个进程中的多个线程能同时被cpu执行
数据共享,操作系统调度的最小单位可以利用多核,操作系统调度,
  数据不安全,开启关闭切换时间消耗小

在CPython中的多线程 - 节省io操作的时间
gc 垃圾回收机制
引用计数 分代回收
全局解释器锁的出现主要是为了完成gc的回收机制,
   对不同线程的引用计数的变化记录的更加准确
全局解释器锁 GIL(global interpreter lock)
导致了同一个进程中的多个线程只能有一个线程能真正被cpu执行
节省的是io操作的时间,而不是cpu计算的时间,因为cup的计算熟读非常快,
  在大部分情况下,我们没有办法把一条进程中所有的io操作都规避掉
from threading import Thread, current_thread, enumerate, active_count
import time


def func(i):
    print(f"开始{i}", current_thread().ident)    # 函数内拿线程id current_thread().ident
    time.sleep(1)
    print(f"结束{i}")

for i in range(10):
    t1 = []
    t = Thread(target=func, args=(i, ))
    t.start()
    print(t.ident)
    t1.append(t)
print(enumerate(), active_count())
for t in t1:
    t.join()
    print("所有线程都执行完了")



# 函数内拿线程id current_thread().ident
# 线程不能从外部关闭
# 所有的子线程只能是自己执行完所有代码之后就关闭
# enumerate 列表  存储了所有活着的线程对象,包括主线程
# activ_count  储存了所有活着的线程个数



# 面向对象的方式启动线程
from threading import Thread
class MyThread(Thread):
    def __init__(self,a,b):
        self.a = a
        self.b = b
        super().__init__()
    def run(self):
        print(self.ident)
t = MyThread(1,2)
t.start()
t.run()


线程共享数据
"""
线程之间的数据共享
"""

from threading import Thread
n = 100

def func():
    global n
    n -= 1
t1 = []
for i in range (100):
    t = Thread(target=func)
    t.start()
    t1.append(t)
for t in t1:
    t.join()
print(n)

 

线程数据不安全
from threading import Thread
n = 0
def add():
    for i in range(500000):
        global n
        n += 1
def sub():
    for i in range(500000):
        global n
        n -= 1

tlist = []
for i in range(2):
    t1 = Thread(target=add)
    t1.start()
    t2 = Thread(target=sub)
    t2.start()
    tlist.append(t1)
    tlist.append(t2)
for t in tlist:
    t.join()
print(n)

 

线程锁
from threading import Thread, Lock
n = 0
def add(lock):
    with lock:
        for i in range(500000):
            global n
            n += 1
def sub(lock):
    with lock:
        for i in range(500000):
            global n
            n -= 1

tlist = []
lock = Lock()
for i in range(2):
    t1 = Thread(target=add,args=(lock, ))
    t1.start()
    t2 = Thread(target=sub, args=(lock, ))
    t2.start()
    tlist.append(t1)
    tlist.append(t2)
for t in tlist:
    t.join()
print(n)

 

守护线程
import time
from threading import Thread

def son():
    while True:
        print("in son")
        time.sleep(1)

t = Thread(target=son)
t.daemon = True
t.start()
"""
主线程会先等子线程结束后结束
    主线程结束进程就会结束
守护线程随着主线程的结束而结束
守护线程会在主线程的代码结束之后继续守护其他子线程

守护进程  会随着主进程的代码结束而结束
    如果主进程代码结束之后还有其他子进程在运行,守护进程不守护
守护线程  随着主线程的结束而结束
    如果主线程代码结束之后还有其他子线程在运行,守护线程也守护
    
守护进程和守护线程的结束原理不一样
守护进程需要主进程来回收资源
守护线程是随着进程的结束才结束的
    其他子线程——》主线程结束——》主进程结束——》整个进程中的所有资源都被回收——》守护线程也会被回收
    
进程是资源分配单位
子进程都需要它的父进程来回收资源
线程都是进程中的资源
所有的线程都会随着进程的结束而被回收

"""

 




标签:Thread,t1,print,线程,进程,守护
From: https://www.cnblogs.com/moon3496694/p/17145752.html

相关文章

  • 创建多线程方式3:实现Callable接口 改造下载图片案例
    packagecom.Test;importorg.apache.commons.io.FileUtils;importjava.io.File;importjava.io.IOException;importjava.net.URL;importjava.util.concurrent.*;//开......
  • Java多线程技能-方法介绍
    java多线程技能技术点:线程的启动如何使线程暂停如何使线程停止线程的优先级线程安全相关的问题方法currentThread()currentThread()方法可返回代码段正在被哪......
  • 多线程 龟兔赛跑案例
    packagecom.Java;publicclassRaceimplementsRunnable{//胜利者privatestaticStringwinner;@Overridepublicvoidrun(){for(inti=0......
  • java多线程:详解JUC
    对应狂神说JUC视频1.JUC是什么java.util下的几个包的简称涉及到多线程的开发java.util.concurrentjava.util.atomicjava.util.concurrent.locks2.线程和进程进程:多个程序......
  • Java的多线程+Socket
    客户端: packagecom.wulala;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net......
  • 线程池使用、countDownLatch、以及数据库批量插入 添加配置优化插入与计算
    //新建线程池ThreadPoolExecutorcpuThreadPoolExecutor=ThreadUtil.getCpuThreadPoolExecutor();//使用CountdoLatchfinalCountDownLatchcountDownLatch=newCou......
  • 线程不安全问题
    使用Runnable接口实现多线程,多个线程操作同一个资源时,线程不安全,出现并发问题。如多个人同时抢票,会出现多个人抢了同一张票的问题,代码如下//多个线程同时操作同一个对象......
  • 线程
    介绍api文档介绍     Thread是Runnable的实现类,也可以说是其子类进程是程序从开始到结束的过程线程是进程进一步划分,是进程不同功能的具体实现 构造方法......
  • Python 多线程中的 Join Lock 和 Event
    Join函数的作用Join函数的作用主要是提供当前线程阻塞,等待线程结束后,在执行下一个线程,保护线程通畅有序执行如下当没有使用join时,主线程结束了子线程还在运行defd......
  • python-基础:线程
    3.线程安全一个线程中可以有多个子线程,且线程可以共享进程中所有的资源多个线程去操作一份资源,高概率性的发生数据混乱的情况,如下:示例importthreadingloop=1000......