python线程与进程手记

------------------------------线程---------------------------
#线程应用的第一种方式:thread模块是比较底层的模块
#import thread:引用的模块
#thread.start_new_thread(defName,()):线程的创建
#thread.exit_thread():线程的结束

#线程应用的第二种方式:threading模块是对thread做了一些包装,可以更方便被引用
#import threading:引用的模块
#myThread=threading.Thread(target=defName,args=(‘Alice‘,)):线程的创建
#myThread.start():线程开始执行
#num=len(threading.enumerate):线程数量的查看

#线程应用的第三种方式:创建一个线程类,继承基类:threading.Thread 。重写def run(self):方法。需要运行的内容,写在run方法里面。
#class MyThread(threading.Thread):创建类的对象
#可以进行重构函数的对应扩展:def __init__(self,name,time):threading.Thread.__init__(self,name=‘对应的线程名字‘)
#myThread=MyThread():创建对象
#myThread.start():线程开始执行

------------------------------线程同步之互斥锁---------------------------
#线程同步之互斥锁
#互斥锁同步:线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引用互斥锁。互斥锁为资源引入一个状态:锁定/非锁定。某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。

#mutex=threading.Lock():创建互斥锁
#if mutex.acquire([blocking]):互斥锁锁定状态,返回值不为0表示上锁成功
# 锁定方法acquire可以有一个blocking参数。如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True);如果设定blocking为False,则当前线程不会堵塞
#mutex.release():互斥锁释放状态

------------------------------线程同步至可重入锁---------------------------
#线程同步之可重入锁
#RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次acquire。直到一个线程所有的acquire都被release,其他的线程才能获得资源:
#mutex=threading.RLock():创建可重入锁
#mutex.acquire():可重入锁锁定状态
#mutex.release():可重入锁释放状态

------------------------------线程同步之条件变量---------------------------
#线程同步之条件变量
#Python提供的Condition对象提供了对复杂线程同步问题的支持。Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。

#Condition对象维护了一个锁(Lock/RLock)和一个waiting池。线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。

#Condition对象的构造函数可以接受一个Lock/RLock对象作为参数,如果没有指定,则Condition对象会在内部自行创建一个RLock。

#除了notify方法外,Condition对象还提供了notifyAll方法,可以通知waiting池中的所有线程尝试acquire内部锁。由于上述机制,处于waiting状态的线程只能通过notify方法唤醒,所以notifyAll的作用在于防止有线程永远处于沉默状态。

#con=threading.Condition():创建条件变量
#con.acquire():条件变量锁定状态
#con.wait():线程释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程
#con.notify():Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁
#con.notifyAll():唤醒所有处于waiting池中的所有线程,防止有线程永远处于沉默状态
#con.release():条件变量释放状态

------------------------------线程同步之队列---------------------------
#from Queue import Queue:进行对应的队列包的引用
#queue=Queue():队列的创建
#queue.qsize():获取队列中内容的数量
#queue.put(内容):向队列中添加对应的数据信息
#queue.set():从队列中取出对应的数据
#queue.empty():查看当前队列内容是否为空

------------------------------线程间通信---------------------------
threading.Event可以使一个线程等待其他线程的通知。其内置了一个标志,初始值为False。线程通过wait()方法进入等待状态,直到另一个线程调用set()方法将内置标志设置为True时,Event通知所有等待状态的线程恢复运行。还可以通过isSet()方法查询Envent对象内置状态的当前值。

#event=threading.Event():进行对应Envent对象的创建
#self.threadEvent=event :重构对应threading.Thread基类中的__init__的方法。
#self.threadEvent.wait():使线程进入等待状态
#event.set():启动waiting池中等待的线程

------------------------------线程的合并和后台线程---------------------------
python的Thread类中还提供了join()方法,使得一个线程可以等待另一个线程执行结束后再继续运行。这个方法还可以设定一个timeout参数,避免无休止的等待。因为两个线程顺序完成,看起来象一个线程,所以称为线程的合并。
默认情况下,主线程在退出时会等待所有子线程的结束。如果希望主线程不等待子线程,而是在退出时自动结束所有的子线程,就需要设置子线程为后台线程(daemon)。方法是通过调用线程类的setDaemon()方法。

#myThread.setDaemon(True):将该线程转为后台线程

------------------------------ThreadLocal---------------------------
global_dict={}
global_dict[threading.current_thread()]

------------------------------多进程---------------------------
在Unix/Linux操作系统中,提供了一个fork()系统函数,它非常特殊。

普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。

子进程永远返回0,而父进程返回子进程的ID。

这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。

#import os :引用对应的进程包

#pid=os.fork():程序执行到os.fork()时,操作系统会创建一个新的进程(子进程),然后复制父进程的所有信息到子进程中,然后父进程和子进程都会从fork()函数中得到一个返回值,其进程中这个值一定是0,而父进程中是子进程的 id号

#os.getpid():获取当前进程的pid
#os.getppid():获取父进程的pid

------------------------------multiprocessing模块---------------------------
#from multiprocessing import Process:multiprocessing模块提供了一个Process类来代表一个进程对象。
#p=Process(target=run_proc,args=(‘test‘,)):创建对应的进程对象
#p.start():进程的启动
#p.join():multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束
#multiprocessing.cpu_count():查看对应的cpu核数
#pipe=multiprocessing.Pipe():创建一个管道,管道两个端口调用分别为pipe[0],pipe[1]
#pipe[0].send(i):为管道一侧进行内容的添加操作
#pipe[0].recv():获取管道一侧的内容信息

时间: 2024-10-10 05:59:39

python线程与进程手记的相关文章

Python 线程(threading) 进程(multiprocessing)

*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD

Python线程,进程,携程,I/O同步,异步

只有本人能看懂的-Python线程,进程,携程,I/O同步,异步 举个栗子: 我想get三个url,先用普通的for循环 import requests from multiprocessing import Process from threading import Thread import requests import time # -----正常遍历 串行 同步----- def get_page(url): page = requests.get(url) print(url) st

python线程、进程和协程

链接:http://www.jb51.net/article/88825.htm 引言 解释器环境:python3.5.1 我们都知道python网络编程的两大必学模块socket和socketserver,其中的socketserver是一个支持IO多路复用和多线程.多进程的模块.一般我们在socketserver服务端代码中都会写这么一句: server = socketserver.ThreadingTCPServer(settings.IP_PORT, MyServer) Threadi

python 线程,进程与协程

引言 线程 创建普通多线程 线程锁 互斥锁 信号量 事件 条件锁 定时器 全局解释器锁 队列 Queue:先进先出队列 LifoQueue:后进先出队列 PriorityQueue:优先级队列 deque:双向队列 引言 在学习过socket和socketserver后,我们了解到socketserver可以支持IO多路复用.在定义socketserver服务端的时候一般会使用: server = socketserver.ThreadingTCPServer(settings.IP_PORT,

python线程、进程、协程

进程与线程之间的定义 计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等. 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构——进程控制块. 进程就是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序.数据集.进程控制块三

Python线程、进程知识整理

一.python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time   def show(arg):     time.sleep(1)     print 'thread'+str(arg)   for i in range(10):     t = t

线程池Python 线程、进程和协程

Python   线程 Threading是用于提供线程相关的操作,线程是应用程序中工作的最小单元.线程与进程的关系下图所示: 子线程是由主线程产生的,但两者并没有关联. 利用threading创建线程: 1 '''利用threading包创建''' 2 import threading 3 import time 4 5 def run(n): 6 time.sleep(2) 7 print("task:",n) 8 9 '''串行:一个运行完后,再运行另外一个''' 10 run(

Python线程与进程的区别

进程的基本概念 概念进程就是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要使用的资源:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志. 线程的基本概念 概念线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资

python线程和进程

线程:计算机能够进行调度的最小单位 一个进程可以包含多个线程,线程共享进程资源 多线程并发 上下文 进程就像一个工作的房间(内存)以及房间里工作需要的资源(I/O啊,网卡啊),线程相当于工作的人 所有的在同一个进程中的线程是共享一块内存空间 pid(唯一的进程标识符) Each process is started with a single thread,often called the primary thread, but can create  additional threads fr