线程 进程学习

1,进程与线程

进程优点:同时利用多个cpu 工作,能同时进行多个操作 效率高

进程缺点:浪费内存

线程优点:共享内存,io操作的时候可以并发

线程缺点:抢占资源

进程不是越多越好  最好= cpu

线程也不是越多越好 具体案例 具体分析 请求上下文切换好时

计算机中执行任务最小单位是线程

IO密集型(不用cpu):
多线程

计算密集型(用cpu):
多进程

创建线程:

import threading
def f1(a):
    pass
t = threading.Thread(target=f1,args=(1,))
t.start()

线程锁:

例如列表【0,1,2,3,4,5,6,7,8,9】,1线程从前往后读取 2线程从后往前修改 会导致任务错误,所以有了线程锁

同一时刻允许一个线程执行操作。

一般用RLock

import threading
import time
gl_num = 0
lock = threading.RLock()      #创建Rlock对象》lock
def Func():
    lock.acquire()            #lock.acqui加锁
    global gl_num
    gl_num += 1
    time.sleep(1)
    print(gl_num)
    lock.release()             #lock.release关闭锁
for i in range(10):
    t = threading.Thread(target=Func)
    t.start()

Event事件 threading.Event 调用 有三个功能 wait 红绿灯 clear 红灯 set 绿灯

import threadingdef do(event):
    print(‘start‘)
    event.wait()
    print(‘execute‘)
event_obj = threading.Event()
for i in range(10):
    t = threading.Thread(target=do, args=(event_obj,))
    t.start()
event_obj.clear()
inp = input(‘input:‘)
if inp == ‘true‘:
    event_obj.set()

queue模块

Queue 就是队列,它是线程安全的

队列的特性:先进先出

import queue

q = queue.Queue(maxsize=0)  #构造一个先进先出的队列,maxsize指定队列长度,为0时,表示队列长度无限。

q.join()  #等到队列为None的时候,再执行别的操作
q.qsize()  #返回队列的大小(不可靠)
q.empty()  #当队列为空的时候,返回True 否则返回False(不可靠)
q.full()  #当队列满的时候,返回True,否则返回False(不可靠)

q.put(item, block=True, timeout=None)  #将item放入Queue尾部,item必须存在,可以参数block默认为True,表示当队列满时,会等待队列给出可用位置
                                       #为Flase时为非阻塞,此时如果队列已经满,会引发queue.Full异常。可以选参数timeout,表示会阻塞的时间,
                                       #如果队列无法给出放入item的位置,则引发queue.Full异常。
q.get(block=True, timeout=None)  #等  移除并返回队列头部的一个值,可选参数block默认为True,表示获取值的时候,如果队列为空,则阻塞,为False时,不阻塞,
                                   #若此时队列为空,则引发 queue.Empty异常。可选参数timeout,表示会阻塞设置的时候,过后,如果队列为空,则引发Empty异常。
q.put_nowait(item)  #等效put(item,block=False)
q.get_nowait()  #不等   等效于 get(item,block=False)

创建进程:

import multiprocessingdef f1(a):    passif __name__ == ‘__main__‘:           #win系统下创建进程需要写    p = multiprocessing.Process(target=f1,args=(1,))    p.start()

进程之间 各自持有一份数据 数据之间无法共享

但是可使用方法使进程间数据共享

m = multiprocessing.Manager()dic = m.dict()可实现进程间数据共享 想表现出来 需要将数据加入字典dic 中查看
import multiprocessing
def f1(i,dic):
    dic[i] = i+100
    print(dic)
if __name__ == ‘__main__‘:
    m = multiprocessing.Manager()
    dic = m.dict()
    for i in range(10):
        p = multiprocessing.Process(target=f1,args=(i,dic,))
        p.start()
        p.join()

进程池Pool

pool = Pool(5)表示设置最大五个进程同时进行的线程池

pool.apply(func=f1,args=(i,))在线程池内设置进程,apply,是排队进行,

pool.apply_async(func=f1,args=(i,))同上 只不过apply_async 是并发进行的,内部无jion,所以 需要在下面设置close,先关闭 然后jion 表示等线程关闭了 主线程再关闭 不然 线程任务没走完 主线程就不等 之间关闭了

pool.apply_async       进程daemon =True

from multiprocessing import Pool
import time
def f1(a):
    time.sleep(1)
    print(a)
def f2():
    pass
if __name__ == ‘__main__‘:
    pool = Pool(5)
    for i in range(10):
        pool.apply(func=f1,args=(i,))
from multiprocessing import Pool
import time
def f1(a):
    time.sleep(1)
    print(a)
def f2():
    pass
if __name__ == ‘__main__‘:
    pool = Pool(5)
    for i in range(50):
        pool.apply_async(func=f1,args=(i,))
    pool.close()
    pool.join()

pool.apply_async()后面可选择设置回调函数 将返回值赋值给设置的回调函数

from multiprocessing import Pool
import time
def f1(a):
    time.sleep(1)
    return a
def f2(a):
    print(a)
if __name__ == ‘__main__‘:
    pool = Pool(5)
    for i in range(10):
        pool.apply_async(func=f1,args=(i,),callback=f2)
    pool.close()
    pool.join()
时间: 2024-10-10 12:48:09

线程 进程学习的相关文章

线程进程学习

# encoding: utf-8 """ @author: lileilei @site: @software: PyCharm @file: login.py @time: 2017/7/26 10:28 """ import requests,time from multiprocessing import Pool url='http://www.jd.com' total=0 suc=0 fail=0 ecept=0 maxtime=0

线程简单学习2

一.理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立.线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单. 多个线程的执行是并发的,也就是在逻辑上"同时",而不管是否是物理上的"同时".如果系统只有一个CPU,那么真正的"同时"是不可能的.多线程和传统的单线程

多线程及线程池学习心得

一.线程的应用与特点 多线程是程序员不可或缺的技术能力,多线程技术在各个方面都有应用,特别在性能优化上更是起到至关重要的作用.但是,如果多线程写得不好,往往会适得其反,特别是高并发时会造成阻塞.超时等现象.多线程具有以下特点:1.独立性,拥有自己独立的资源,拥有自己私有的地址空间:2.动态性,进程具有自己的生命周期和各种不同的状态:3.并发性,多个进程可以在单个处理器上并发执行,不会相互影响,并行是指同一时刻有多条指令在多个处理器上同时执行.线程是进程的组成部分,一个进程可以拥有多个线程,一个线

Android多线程编程之线程池学习篇(一)

Android多线程编程之线程池学习篇(一) 一.前言 Android应用开发中多线程编程应用比较广泛,而应用比较多的是ThreadPoolExecutor,AsyncTask,IntentService,HandlerThread,AsyncTaskLoader等,为了更详细的分析每一种实现方式,将单独成篇分析.后续篇章中可能涉及到线程池的知识,特此本篇分析为何使用线程池,如何使用线程池以及线程池的使用原理. 二.Thread Pool基础 进程代表一个运行中的程序,一个运行中的Android

线程 进程 多线程 多进程

进程和线程的主要区别在于多进程每个进程拥有独立存储空间,而多线程共享存储空间.对于单核CPU来讲,如果是阻塞操作,或者不耗时非阻塞操作,多进程/线程不会提高效率,这时候多进程/线程最有用的通常是耗时而又非阻塞的I/O操作. 打个比喻,一个人要看两部电影,可以看完一部再看另一部,也可以同时看,看一眼这个暂停,看一眼那个再暂停看回前一个,快速不停切换,你会觉得因为两部一起看所以先看完吗?理论上两部电影播放时间加起来是一样,所以看完所用时间应该一样.但是实际使用时间反而可能第一种方法快,为什么?切换是

Java 线程池学习

Reference: <创建Java线程池>[1],<Java线程:新特征-线程池>[2], <Java线程池学习>[3],<线程池ThreadPoolExecutor使用简介>[4],<Java5中的线程池实例讲解>[5],<ThreadPoolExecutor使用和思考>[6] [1]中博主自己通过ThreadGroup实现一个线程池(挺方便理解的),使用的是jdk1.4版本,Jdk1.5版本以上提供了现成的线程池. [2]中介绍

线程进程概述

进程和线程目的,提高执行效率 1,单进程单线程,主进程,主线程 2,自定义线程: 主线程 主线程 子线程 进程: 优点,同时利用多个CPU,能同时进行多个操作 缺点,耗费资源,(重新开辟内存) 线程: 优点,共享内存,IO操作时候,创造并发操作 缺点,抢占资源 进程不是 越多越好,CPU个数=等于进程个数 线程也不是越多约好,具体案例具体分析 计算机中执行任务的最小单元是:线程 IO 操作利用CPU GIL,全局解释器锁 IO密集型(不用CPU) 多线程 计算密集型(用CPU) 多进程

Linux 进程学习

------------------------------------------------------------------------------------------- ps 显示瞬间进程的状态,并不动态连续,如果想对进程进行时间控制,应该用top     -A 列出所有的行程  -w 显示加宽可以显示较多的资讯  -au 显示较详细的资讯  -aux 显示所有包含其他使用者的进程 #平时用的比较多的是 ps axu  # -e 显示所有进程 -f 显示所有进程的所有信息 -r 只

我的读书笔记(线程进程)

线程有时候可以被称为微进程或轻量级进程,它的概念和进程十分相似,是一个可以被调度的单元,并且维护自己的堆栈和上下文环境,线程是附属进程的,一个进程可以包含1个或者多个线程,并且同一进程内的多个线程共享一块内存快和资源,一个线程是一个操作系统可调度的基本单元,但同时它的调度受限于包含该线程的进程,也就是说操作系统首先决定了下一个执行的进程,进而才会调度该进程内的线程 线程和进程最大的区别在于隔离性的问题,每个进程都被单独地隔离,拥有自己的内存快,独占的资源及运行数据,一个进程的崩溃不会影响到其他进