python多线程及多进程对于不同平台有不同的工具(platform-specific tools),如os.fork仅在Unix上可用,而windows不可用,该文仅针对windows平台可用的工具进行总结。

1.多线程

单线程中,如果某一任务(代码块)是long-time running的,则必须等待该任务(代码块)结束,才可以对下一个任务进行操作,为解决long-time 任务的block问题,可将创建多个线程,间隔选择多线程进行操作。python 中多线程常用的库为_thread,threading,其中,_thread为较底层的库,threading 为较高级的库,它们都是将可调用对象传入线程中,进行操作不同的任务。下面分别对这两个库进行简单的总结:

(1)_thread库

(a)创建线程

创建线程为_thread.start_new_thread(func,args),这里func为可调对象,如简单函数,lambda函数,bound方法,args为func中的参数(以元组的形式)。

(b)GIL全局解释器锁(Global interpreter lock)

为解决多线程对全局可变对象的修改等问题,每个线程在运行时,都必须使用(或引用)同一个GIL锁,以保证每个时间点仅有一个线程在运行。_thread库创建GIL为:lock=_thread.allocate_lock(),在进程操作前后分别加上lock.acquare(),lock.release(),或者直接用with打开锁。

(c)与主线程关系

因为主线程结束后,所有子线程全部强行结束,所以一般在主线程上加上time.sleep()方法,或者在主线程中遍历子线程列表集合判定是否所有线程结束来确保所有子线程结束后再结束。

(2)threading库

(a)创建线程

可以一方面:使用类来创建新进程,如下:

class Mythread(threading.Thread):
def __init__(self,myId,count,mutex):
self.myId=myId
self.count=count
self.mutex=mutex
threading.Thread.__init__(self)
def run(self):
for i in range(self.count):
with self.mutex:
print('[%s]=>%s'%(self.myId,i))

通过重写run(),来具体化创建的进程所执行的任务。

另一方面:直接使用。

thread=threading.Thread(target=func,args=(argument,))这里,func是可调对象,argument是func的参数。

(b)启动线程。

与_thread库不同,threading库在创建完线程后,还需要start()来启动。启动后,join()方法可保证子线程全部结束后,主线程再退出。

(c)GIL

有自己的threading.Lock(),一般在执行代码前用with打开。

2.多进程

python 中多进程的库为multiprocess,该库有2个特点:子进程与主进程不共用全局可变变量;所有参数为pickle对象。

(1)创建

一般需要嵌入在if __name__=='__main__':,process=multiprocessing.Process(target=func,args=(argument,))

(2)启动进程

process.start()

process.join()阻塞主进程,直到子进程结束,如果.join()放置于使得子进程函数不能结束的位于主进程的语句前,那么该子进程将永远阻塞主进程。

(3)传递信息和共享状态

该模块自带Queue,Pipe,其中Pipe为双向传递,Queue为多个进程传递,一般为produer,consumer模式。需要注意的是使用Queue时,还需要import queue,以此来捕捉queue.EmptyError,共享状态通过Value,Array

(4)新的程序

可将Process与os.exec*结合起来,如:

"""
Combine multiprocessing.Process with exec* to start independent programs
"""
import os
from multiprocessing import Process
def runprogram(arg):
os.execlp('python','python','child.py',str(arg)) if __name__=='__main__':
for i in range(5):
Process(target=runprogram,args=(i,)).start()
print('parent exits')

而child.py代码如下:

import sys,os,sys

print('\n','version:',sys.version,'Hello from',os.getpid(),sys.argv[1])

运行如下:

version: 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] Hello from 5268 2
version: 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] Hello from 11176 4
version: 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] Hello from 11380 1
version: 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] Hello from 876 0
version: 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] Hello from 1644 3

基于Windows平台的Python多线程及多进程学习小结的更多相关文章

  1. Python 多线程、多进程 (三)之 线程进程对比、多进程

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.多线程与多进 ...

  2. Python 多线程、多进程 (一)之 源码执行流程、GIL

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...

  3. Python多线程和多进程谁更快?

    python多进程和多线程谁更快 python3.6 threading和multiprocessing 四核+三星250G-850-SSD 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很 ...

  4. MapReduce编程模型详解(基于Windows平台Eclipse)

    本文基于Windows平台Eclipse,以使用MapReduce编程模型统计文本文件中相同单词的个数来详述了整个编程流程及需要注意的地方.不当之处还请留言指出. 前期准备 hadoop集群的搭建 编 ...

  5. python多线程与多进程--存活主机ping扫描以及爬取股票价格

    python多线程与多进程 多线程: 案例:扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活) 普通版本: #扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活)im ...

  6. Python 多线程、多进程 (二)之 多线程、同步、通信

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...

  7. python多线程与多进程及其区别

    个人一直觉得对学习任何知识而言,概念是相当重要的.掌握了概念和原理,细节可以留给实践去推敲.掌握的关键在于理解,通过具体的实例和实际操作来感性的体会概念和原理可以起到很好的效果.本文通过一些具体的例子 ...

  8. pthread多线程编程的学习小结

    pthread多线程编程的学习小结  pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写     程序员必上的开发者服务平台 —— DevSt ...

  9. clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结(转)

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...

随机推荐

  1. java并发AtomicIntegerArray

    java并发AtomicIntegerArray AtomicIntegerArray的原子性 AtomicIntegerArray的原子性是对数组的元素的,不是数组. 源码基于openjdk 1.8 ...

  2. cover-view子节点溢出父节点被剪切的问题

    因为之前在使用自定义tabbar的时候,使用了cover-view, 导致溢出父节点的那部分被剪切掉,因为没找到有类似的问题出现, 所以我在布局方面做了调整: .tab-bar { overflowY ...

  3. Day3-K-Can you solve this equation? HDU2199

    Now,given the equation 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y,can you find its solution between 0 and ...

  4. 关于fpga的后仿真重要性

    也许你天天做些fpga,写完代码就直接编译成功,锁定引脚后,马上使用signaltaII软件. 也许你一天,你发现signaltapII看信号的痛苦,一个源代码文件修改一点,要花个20分钟编译一次. ...

  5. Ecshop系统二次开发教程及流程演示

      来源:互联网 作者:佚名 时间:03-01 16:05:31 [大 中 小] Ecshop想必大家不会觉得陌生吧,大部分的B2C独立网店系统都用的是Ecshop系统,很受用户的喜爱,但是由于Ecs ...

  6. Matplotlib 饼图

    章节 Matplotlib 安装 Matplotlib 入门 Matplotlib 基本概念 Matplotlib 图形绘制 Matplotlib 多个图形 Matplotlib 其他类型图形 Mat ...

  7. SciPy 安装

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  8. Python学习笔记之基础篇(-)python介绍与安装

    Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...

  9. UITree_study

    1.Create canvas 2.Add TreeView 3.Subscribe and unsubscribe events(订阅和取消订阅事件) 4.Data bind items it's ...

  10. MyISAM与InnoDB 的区别

    1. 事务:InnoDB支持,MyISAM不支持,在InnoDB中每一条SQL语句都会默认封装成事务自动提交,然而这样会影响速度,因此最好把多条SQL语句放在begin和commit之间组成一个事务: ...