Python多线程编程学习中有哪些基础知识要掌握
Admin 2022-06-28 群英技术资讯 332 次浏览
现代操作系统比如Mac OS X
, Linux
,Windows
等,都是支持“多任务”的操作系统。
什么叫“多任务”(multitasking
)呢?简单地说,就是操作系统可以同时运行多个任务。例如你一边在用浏览器上查资料,一边在听MP3,一边在用Word写文档,这就是多任务。
打开Windows的任务管理器,可以直观的了解一下:
(task)是最抽象的,是一个一般性的术语,指由软件完成的一个活动。一个任务既可以是一个进程,也可以是一个线程。简而言之,它指的是一系列共同达到某一目的的操作。例如,读取数据并将数据放入内存中。这个任务可以作为一个进程来实现,也可以作为一个线程(或作为一个中断任务)来实现。
单核CPU如何实现“多任务”
三个任务A,B,C在单个CPU上交替执行,逻辑上表现为三个执行实例并发执行,但实质物理上是串行执行。
多核CPU如何实现“多任务”
多任务的真正并行只能在多核CPU上实现,但是,一般而言,任务的数量多于CPU的核数,还是需要将多个任务轮流调度到每个核上执行。
单核与多核处理器(Multi-core processor
)示例
多核CPU:简单地说是将多个核心装载一个封装里,外观上看是一个处理器。
串行:一个处理完再一个。
并行:指两个或者多个事件在同一时刻发生。
并发:指两个或多个事件在同一时间间隔内发生。
例如:并发时你正在吃饭,吃到一半电话响,去接电话,接完后继续吃饭;并行时边吃饭边打电话。
(process)常常被定义为程序的执行。可以把一个进程看成是一个独立的程序,在内存中有其完备的数据空间和代码空间。一个进程所拥有的数据和变量只属于它自己。
(tread)则是某一进程中一路单独运行的程序。也就是说,线程存在于进程之中。一个进程由一个或多个线程构成,各线程共享相同的代码和全局数据 ,但各有其自己的堆栈。由于堆栈是每个线程一个,所以局部变量对每一线程来说是私有的 。由于所有线程共享同样的代码和全局数据,它们比进程更紧密,比单独的进程间更趋向于相互作用,线程间的相互作用更容易些,因为它们本身就有某些供通信用的共享内存:进程的全局数据。
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
multiprocessing --- 基于进程的并行 — Python 3.10.0 文档
threading --- 基于线程的并行 — Python 3.10.0 文档
在Unix/Linux下,Mac系统是基于BSD(Unix的一种)内核,都可以使用fork()调用实现多进程,Python的os模块封装了常见的系统调用,其中就包括fork。例如:
import os print('Process (%s) start...' % os.getpid()) # Only works on Unix/Linux/Mac: pid = os.fork() #Windows中不支持fork(),将报错 if pid == 0: print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())) else: print('I (%s) just created a child process (%s).' % (os.getpid(), pid))
需要注意的是,上述代码在Unix/Linux、Mac系统中可以运行,但在Windows中运行报错:
AttributeError: module 'os' has no attribute 'fork'
因为Windows没有fork调用,怎么办?
multiprocessing模块是跨平台版本的多进程模块。在Windows上用Python编写多进程的程序,可以使用multiprocessing模块。multiprocessing模块提供了一个Process类来代表一个进程对象。
Process([group [, target [, name [, args [, kwargs]]]]])
group
:指定进程组,目前只能使用Nonetarget
:执行的目标任务名name
:进程名字,默认为Process-N,N为从1开始递增的整数args
:以元组方式给执行任务传参kwargs
:以字典方式给执行任务传参Process创建的实例对象的常用方法:
start()
:启动子进程实例(创建子进程)join()
:等待子进程执行结束terminate()
:不管任务是否完成,立即终止子进程Process创建的实例对象的常用属性:
例如:
import multiprocessing import time # 跳舞任务 def dance(): for i in range(3): print("跳舞中...") time.sleep(0.2) # 唱歌任务 def sing(): for i in range(3): print("唱歌中...") time.sleep(0.2) dance_process = multiprocessing.Process(target=dance(), name="myprocess1") sing_process = multiprocessing.Process(target=sing()) # 启动子进程执行对应的任务 dance_process.start() sing_process.start()
执行结果如下图:
多任务可以由多进程完成,也可以由一个进程内的多线程完成。
Python的标准库提供了两个模块:_thread
和threading
,_thread是低级模块,threading是高级模块,对_thread进行了封装。绝大多数情况下,使用threading这个高级模块。
Thread([group [, target [, name [, args [, kwargs]]]]])
group
: 线程组,目前只能使用Nonetarget
: 执行的目标任务名args
: 以元组的方式给执行任务传参kwargs
: 以字典方式给执行任务传参name
: 线程名,一般不用设置Thread类提供了以下方法:
run()
: 用以表示线程活动的方法。start()
:启动线程活动。join([time])
: 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。isAlive()
:
返回线程是否活动的。getName()
: 返回线程名。setName()
: 设置线程名。启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行,例子:
import time, threading # 新线程执行的代码: def loop(): print('thread %s is running...' % threading.current_thread().name) n = 0 while n < 5: n = n + 1 print('thread %s >>> %s' % (threading.current_thread().name, n)) time.sleep(1) print('thread %s ended.' % threading.current_thread().name) print('thread %s is running...' % threading.current_thread().name) t = threading.Thread(target=loop, name='LoopThread') t.start() t.join() print('thread %s ended.' % threading.current_thread().name)
执行结果如下图:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
python操作excel主要用到xlrd和xlwt两个库,xlrd读取表格数据,支持xlsx和xls格式的excel表格;xlwt写入excel表格数据
一、安装此处以Ubuntu12.04为例:$sudoapt-getinstallipythonpython-matplotlibpython-numpy二、简单实例>>>importmatplotlib.pyplotasplt>>>>>>plt.figure(1)
这篇文章给大家分享的是python中lstrip()用法。lstrip() 方法用于截掉字符串左边的空格或指定的字符,小编觉得挺实用的,因此分享给大家做个参考,文中示例代码介绍的非常详细,感兴趣的朋友接下来一起跟随小编看看吧。
这篇文章主要介绍了Python数据分析之 Matplotlib 折线图绘制,在数据分析中,数据可视化也非常重要,下文通过数据分析展开对折线图的绘制,需要的小伙伴可以参考一下
这篇文章主要介绍了python基础之画图神器matplotlib,文中有非常详细的代码示例,对正在学习python的小伙伴们有一定的帮助,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008