最近需要使用 python3 多线程处理大型数据,顺道探究了一下,python3 的线程模型的情况,下面进行简要记录;

多线程运行的优点:

  • 使用线程可以把程序中占用时间较长的任务放到后台去处理;
  • 用户界面可以更加吸引人,并且不阻塞界面的运行;
  • 程序运行的速度可以更快;
  • 充分利用CPU多核的特征进行处理;

内核线程:由操作系统内核创建和撤销;

用户线程:不需要内核支持在用户程序中实现的线程;

Python3 中的多线程:

  • _thread 提供了一些原始的api 用于写多线程程序;
  • threading 提供了更加便利的接口
  • 两者都是python3内置的线程模块
#!/usr/bin/env python

import _thread

def print_time( threadName, delay):
print (threadName)
count =
while :
pass
count += try:
_thread.start_new_thread( print_time, ("Thread-1", , ) )
_thread.start_new_thread( print_time, ("Thread-2", , ) )
_thread.start_new_thread( print_time, ("Thread-3", , ) )
_thread.start_new_thread( print_time, ("Thread-4", , ) )
_thread.start_new_thread( print_time, ("Thread-5", , ) )
_thread.start_new_thread( print_time, ("Thread-6", , ) )
_thread.start_new_thread( print_time, ("Thread-7", , ) )
_thread.start_new_thread( print_time, ("Thread-8", , ) )
_thread.start_new_thread( print_time, ("Thread-9", , ) )
_thread.start_new_thread( print_time, ("Thread-10", , ) )
_thread.start_new_thread( print_time, ("Thread-11", , ) )
_thread.start_new_thread( print_time, ("Thread-12", , ) )
_thread.start_new_thread( print_time, ("Thread-13", , ) )
_thread.start_new_thread( print_time, ("Thread-14", , ) )
_thread.start_new_thread( print_time, ("Thread-15", , ) ) except:
print ("Error: can't start thread!") while :
pass

_thread测试

#!/usr/bin/env python3

import threading
import time exitFlag = class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print ("start" + self.name)
print_time(self.name, self.counter, )
print ("exit" + self.name) def print_time(threadName, delay, counter):
while counter:
if exitFlag:
threadName.exit()
time.sleep(delay)
print ("%s: %s" % (threadName, time.ctime(time.time())))
counter -= thread1 = myThread(, "Thread-1", )
thread2 = myThread(, "Thread-2", ) thread1.start()
thread2.start()
thread1.join()
thread2.join() print ("exit!")

threading测试

python 的多线程 threading 有时候并不是特别理想. 最主要的原因是就是, Python 的设计上, 有一个必要的环节, 就是Global Interpreter Lock (GIL). 这个东西让 Python 还是一次性只能处理一个东西:

尽管Python完全支持多线程编程, 但是解释器的C语言实现部分在完全并行执行时并不是线程安全的。 实际上,解释器被一个全局解释器锁保护着,它确保任何时候都只有一个Python线程执行。 GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行); 如果要进行利用python的多进程形式,可以使用python的 multiprocessing 编程模型包;

GIL只会影响到那些严重依赖CPU的程序(比如计算型的)。 如果你的程序大部分只会涉及到I/O,比如网络交互,那么使用多线程就很合适, 因为它们大部分时间都在等待;

import threading
from queue import Queue
import copy
import time def job(l, q):
res = sum(l)
q.put(res) def multithreading(l):
q = Queue()
threads = []
for i in range():
t = threading.Thread(target=job, args=(copy.copy(l), q), name='T%i' % i)
t.start()
threads.append(t)
[t.join() for t in threads]
total =
for _ in range():
total += q.get()
print(total) def normal(l):
total = sum(l)
print(total) if __name__ == '__main__':
l = list(range())
s_t = time.time()
normal(l*)
print('normal: ',time.time()-s_t)
s_t = time.time()
multithreading(l)
print('multithreading: ', time.time()-s_t)

GIL测试

#!/usr/bin/env python

import multiprocessing as mp
import threading as td def job(a,b):
while :
pass t1 = td.Thread(target=job,args=(,))
t2 = td.Thread(target=job,args=(,))
t3 = td.Thread(target=job,args=(,))
t4 = td.Thread(target=job,args=(,))
t5 = td.Thread(target=job,args=(,))
t6 = td.Thread(target=job,args=(,))
t7 = td.Thread(target=job,args=(,))
t8 = td.Thread(target=job,args=(,))
t9 = td.Thread(target=job,args=(,))
t10 = td.Thread(target=job,args=(,))
t11 = td.Thread(target=job,args=(,))
t12 = td.Thread(target=job,args=(,))
t13 = td.Thread(target=job,args=(,))
t14 = td.Thread(target=job,args=(,))
t15 = td.Thread(target=job,args=(,))
t16 = td.Thread(target=job,args=(,))
# p1 = mp.Process(target=job,args=(,))
# p2 = mp.Process(target=job,args=(,))
# p3 = mp.Process(target=job,args=(,))
# p4 = mp.Process(target=job,args=(,))
# p5 = mp.Process(target=job,args=(,))
# p6 = mp.Process(target=job,args=(,))
# p7 = mp.Process(target=job,args=(,))
# p8 = mp.Process(target=job,args=(,))
# p9 = mp.Process(target=job,args=(,))
# p10 = mp.Process(target=job,args=(,))
# p11 = mp.Process(target=job,args=(,))
# p12 = mp.Process(target=job,args=(,))
# p13 = mp.Process(target=job,args=(,))
# p14 = mp.Process(target=job,args=(,))
# p15 = mp.Process(target=job,args=(,))
# p16 = mp.Process(target=job,args=(,)) t1.start()
t2.start()
t3.start()
t4.start()
t5.start()
t6.start()
t7.start()
t8.start()
t9.start()
t10.start()
t11.start()
t12.start()
t13.start()
t14.start()
t15.start()
t16.start()
# p1.start()
# p2.start()
# p3.start()
# p4.start()
# p5.start()
# p6.start()
# p7.start()
# p8.start()
# p9.start()
# p10.start()
# p11.start()
# p12.start()
# p13.start()
# p14.start()
# p15.start()
# p16.start()
t1.join()
t2.join()
t3.join()
t4.join()
t5.join()
t6.join()
t7.join()
t8.join()
t9.join()
t10.join()
t11.join()
t12.join()
t13.join()
t14.join()
t15.join()
t16.join()
# p1.join()
# p2.join()
# p3.join()
# p4.join()
# p5.join()
# p6.join()
# p7.join()
# p8.join()
# p9.join()
# p10.join()
# p11.join()
# p12.join()
# p13.join()
# p14.join()
# p15.join()
# p16.join()

跑满你的CPU process vs thread (以16线程CPU为例)

使用python multiprocess 包能够发挥多核CPU并行处理能力

  • multiprocess 接口和threading 使用的接口一样;

并发控制:

  • 进程锁: mp.Lock(), mp.acquire(), mp.release()
  • 线程锁: td.Lock(), td.acquire(), td.release()
  • python 为了提高可用性,保证了multiprocessing 和 threading 中,大多数接口使用都是相同的,较为方便;
  • 多cpu之间,通过共享内存交流;mp.Value('i', 0)
  • 输出队列:mp.Queue() 而 线程之间可以共享内存,可以直接使用 from queue import Queue 来进行引入队列进行使用;

保持更新,转载请注明出处,更多内容请关注cnblogs.com/xuyaowen;

参考链接:

https://morvanzhou.github.io/tutorials/python-basic/threading/5-GIL/

https://python3-cookbook.readthedocs.io/zh_CN/latest/c12/p09_dealing_with_gil_stop_worring_about_it.html  (Python Cookbook 3rd Edition Documentation)

https://morvanzhou.github.io/tutorials/python-basic/multiprocessing/2-add/

Python 3 线程模型,进程模型记录的更多相关文章

  1. Python之线程、进程和协程

    python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...

  2. Python 中线程和进程

    目录 线程和进程 一. 什么是进程 / 线程 1. 引论 2. 线程 3. 进程 4. 区别 5. 使用 二. 多线程使用 1. 常用方法 2. 常用参数 3. 多线程的应用 3.1 重写线程法 3. ...

  3. Python之线程与进程

    今天我们来了解一下Python的线程和进程的管理机制 首先,我们要了解下线程跟进程的概念: 线程(Thread)是操作系统能够进行运算调度的最小的单位,是一堆cpu的指令.他被包含在进程中,是进程中的 ...

  4. 操作系统/应用程序、操作中的“并发”、线程和进程,python中线程和进程(GIL锁),python线程编写+锁

    并发编程前言: 1.网络应用 1)爬虫 直接应用并发编程: 2)网络框架 django flask tornado 源码-并发编程 3)socketserver 源码-并发编程 2.运维领域 1)自动 ...

  5. python中线程和进程的简单了解

    python中线程和进程的简单了解   一.操作系统.应用程序 1.硬件:硬盘.cpu.主板.显卡........ 2.装系统(本身也是一个软件): 系统就是一个由程序员写出来的软件,该软件用于控制计 ...

  6. Python菜鸟之路:Python基础-线程、进程、协程

    上节内容,简单的介绍了线程和进程,并且介绍了Python中的GIL机制.本节详细介绍线程.进程以及协程的概念及实现. 线程 基本使用 方法1: 创建一个threading.Thread对象,在它的初始 ...

  7. Python基础—线程、进程和协程

    今天已是学习Python的第十一天,来干一碗鸡汤继续今天的内容,今天的鸡汤是:超越别人对你的期望.本篇博客主要介绍以下几点内容: 线程的基本使用: 线程的锁机制: 生产者消费之模型(队列): 如何自定 ...

  8. Python自动化 【第九篇】:Python基础-线程、进程及python GIL全局解释器锁

    本节内容: 进程与线程区别 线程 a)  语法 b)  join c)  线程锁之Lock\Rlock\信号量 d)  将线程变为守护进程 e)  Event事件 f)   queue队列 g)  生 ...

  9. python 四——线程、进程、协程

    内容概要 1.进程与线程优.缺点的比较 2.适用情况 3.线程 线程的创建 setDaemon join event RLock 队列 4.进程 创建进程 setDaemon join 线程与进程,数 ...

  10. python之线程和进程(并发编程)

    python的GIL In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native ...

随机推荐

  1. 形如 T(n) = a * T(n/b) + f(n) 的时间复杂度计算方法

    形如 T(n) = a * T(n/b) + f(n) 的时间复杂度计算方法 有一种方法叫做主方法(Master method)是用来专门计算这种形式的时间复杂度的,方法具体如下: 下边举例进行说明: ...

  2. ConcurrentHashMap(1.7)分析

    1.  先来了解ConcurrentHashMap中的几个成员,当然大多数与HashMap中的相似,我们只看独有的成员 /** * The default concurrency level for ...

  3. c博客06-2019-结构体&文件

    1.本章学习总结 1.1 学习内容总结 结构体如何定义.成员如何赋值: 1.常见的定义: struct student { int num; char name[20]; }stu; //2.采用ty ...

  4. springboot2.x实现oauth2授权码登陆

    参考文章:https://blog.csdn.net/qq_27828675/article/details/82466599 一 进行授权页 浏览器输入http://localhost:8081/o ...

  5. Using the Security System 使用安全系统

    In this lesson, you will learn how to use a Security System in the application. When you use this sy ...

  6. Flutter学习笔记(26)--返回拦截WillPopScope,实现1秒内点击两次返回按钮退出程序

    如需转载,请注明出处:Flutter学习笔记(26)--返回拦截WillPopScope,实现1秒内点击两次返回按钮退出程序 在实际开发中,为了防止用户误触返回按钮导致程序退出,通常会设置为在1秒内连 ...

  7. 个人app如何收集用户日志

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/147 个人app如何收集用户日志,相信不少人对这个话题感兴 ...

  8. webpack css模块化和ant-design按需加载冲突

    其实具体出现了什么问题,我也记得不清楚了,今天突然回想起来必须记录一下,一个思想就是用exclude将node_module目录下的文件排除,网上有很多相关例子,但不知是不是因为时间久远,都不生效,无 ...

  9. 腾讯 Techo 开发者大会首发来袭!云原生中间件技术实践等你来!

    腾讯 Techo 开发者大会是由腾讯云发起的面向全球开发者和技术爱好者的年度盛会,2019 年 11 月 6 日 - 7 日将在北京嘉里大酒店首次召开. 作为一个专注于前沿技术研讨的非商业大会,Tec ...

  10. Oracle11G_R2中共享服务器模式和专用服务器模式参数解释及设置

    sys@MYTESTDB> show parameterNAME TYPE VALUE------------------------------------ ----------- ----- ...