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. Centos7精简版安装常用扩展插件

    一.安装ifconfig *确认本机是否真实存在ifconfig* echo $PATH 查看环境变量路径 ls /usr/sbin/ 查看此路径下是否有ifconfig这个程序 find / -na ...

  2. Python用户界面编程PyQt5的四种的布局方式

    1.QT是C++编写的跨平台GUI库,GUI是指桌面程序应用. 2.开发基于pyqt5的桌面应用程序必须要使用两个类Qapplication和Qwidget类,都在PyQt5.Qt.widgets里面 ...

  3. jmeter之JDBC请求遇到的问题

    1. 时区设置问题 Cannot create PoolableConnectionFactory (The server time zone value '???��������??��??' is ...

  4. mybatis 入门参考

    参考:https://www.cnblogs.com/xdp-gacl/p/4261895.html

  5. D - Beautiful Graph (深搜)

    这个题深搜容易解决,结果用了广搜,动手之前还是要想清楚,然后自己的代码写错的情况下,没有重写,而是在原有的基础上,进行修改,结果有个判定的初始化条件放错位置,浪费了一个小时... 就是给一个无向图,任 ...

  6. js 用于运行string中的<script>和</script>之间的函数

    /** * Created by 炜文 on 2017/2/15. */ var intext = '485222<script> var i=2;var j=2;console.log( ...

  7. 「SCOI2009」windy数

    传送门 Luogu 解题思路 数位 \(\text{DP}\) 设状态 \(dp[now][las][0/1][0/1]\) 表示当前 \(\text{DP}\) 到第 \(i\) 位,前一个数是 \ ...

  8. C# 篇基础知识1——编译、进制转换、内存单位、变量

    编译:C#语言要经过两次编译,程序员编写好源代码后进行第一次编译,将源代码编译为微软中间语言(MSIL),生成可以发布的应用软件:当用户使用软件时,MSIL代码会在首次载入内存后进行第二次编译,中间语 ...

  9. Sweet Round 1题解

    感谢各位参赛者,所有的题解如下: T1 syx的奖励 这题明显是签到题了吧,随便猜猜结论就A掉了 先说怎么做吧,把所有的可走的数gcd起来,然后再与n求gcd 如果为1,则输出n,若不为1,则输出-1 ...

  10. 图片转换到指定大小PDF

    1.首先转换为eps jpeg2ps compile to exec file ./jpeg2ps  -p a4  a.jpg -o x.eps2.从eps转换到pdf ps2pdf -dDownsa ...