基于Windows平台的Python多线程及多进程学习小结
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多线程及多进程学习小结的更多相关文章
- Python 多线程、多进程 (三)之 线程进程对比、多进程
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.多线程与多进 ...
- Python 多线程、多进程 (一)之 源码执行流程、GIL
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...
- Python多线程和多进程谁更快?
python多进程和多线程谁更快 python3.6 threading和multiprocessing 四核+三星250G-850-SSD 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很 ...
- MapReduce编程模型详解(基于Windows平台Eclipse)
本文基于Windows平台Eclipse,以使用MapReduce编程模型统计文本文件中相同单词的个数来详述了整个编程流程及需要注意的地方.不当之处还请留言指出. 前期准备 hadoop集群的搭建 编 ...
- python多线程与多进程--存活主机ping扫描以及爬取股票价格
python多线程与多进程 多线程: 案例:扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活) 普通版本: #扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活)im ...
- Python 多线程、多进程 (二)之 多线程、同步、通信
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...
- python多线程与多进程及其区别
个人一直觉得对学习任何知识而言,概念是相当重要的.掌握了概念和原理,细节可以留给实践去推敲.掌握的关键在于理解,通过具体的实例和实际操作来感性的体会概念和原理可以起到很好的效果.本文通过一些具体的例子 ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结(转)
进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...
随机推荐
- python中时间戳的探索
声明 本文章只针对python3.6及以上版本. 问题提出 首先,我们先import一些必要模块: In [1]: from datetime import datetime, timezone, t ...
- 关于Redis 分布式 微服务 集群Cluster
一:Redis 1,redis是一个高性能的键值对存储方式的数据库,同时还提供list,set,zset,hash等数据结构的存储. 2,Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集 ...
- Android开发_*.R文件无法自动生成
问题描述: 今天是我决定专注Android开发的第一天,我在网上下载了一个数独游戏的源码,准备开始着手学习.在导入之后出现Java文件中import *.R文件报错,在gen目 ...
- jqueery easyui tree把已选中的节点数据拼成json或者数组(非常重要)
jqueery easyui tree把已选中的节点数据拼成json或者数组 pqxhk10级分类:其他被浏览14次2018.01.19 https://wenda.so.com/q/1535702 ...
- PHP7 源码整体框架
一.PHP7语言执行原理 常用的高级语言有很多种,根据运行的方式不同,大体分为两种:编译型语言和解释型语言. 编译是指在应用源程序执行之前,就将程序源代码“翻译”成汇编语言,然后进一步根据软硬件环境编 ...
- linux(centos6.9)下rpm方式安装mysql后mysql服务无法启动
以下两种方式启动都报错:启动失败: [root@node03 ~]# service mysqld startMySQL Daemon failed to start.Starting mysqld: ...
- 智能充电安全管理首选SOC单芯片方案:SI24R2F
SI24R2F简介: SI24R2F是一颗工作在2.45GHZ ISM 频段,专为低功耗有源RFID应用场合设计,集成崁入式2.45GHZ 无线射频发射器模块.64次可编程NVM存储器模块 ...
- id 和 class的区别
id 选择器 ID 只能被指定单个元素使用,无法多个元素使用.像你的身份证号,是唯一的,id 选择器以 “#” 来定义.id选择器的优先级高于class选择器的优先级的 # userid { text ...
- 基于vue-router的移动端网页的路由管理
本篇代码示例:github 前提:不关注移动端浏览器的前进事件 涵盖功能: 1,管理路由的历史记录 2,切页动画的实现 3,处理流程类页面的回退事件 描述: 流程类页面的回退事件的解释: 以注册 ...
- RAM和ROM的区别
区别如下: 1.概念 RAM(random access memory)即随机存储内存,这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序.ROM(Read-Only Memory)即 ...