Python之多线程和多进程
一、多线程
1、顺序执行单个线程,注意要顺序执行的话,需要用join。
#coding=utf-8 from threading import Thread
import time def my_counter():
i = 0
for _ in range(100000000):
i = i + 1
return True def main():
thread_array = {}
start_time = time.time()
for tid in range(2):
t = Thread(target=my_counter)
t.start()
# join阻塞下个线程,除非当前线程执行完毕
t.join()
end_time = time.time()
print("Total time: {}".format(end_time - start_time)) if __name__ == '__main__':
执行结果:

2、同时执行两个并发线程
#coding=utf-8 from threading import Thread
import time def prn_obj(obj):
return '\n'.join(['%s:%s' % item for item in obj.__dict__.items()]) def my_counter():
i = 0
for _ in range(100000000):
i = i + 1
return True def main():
thread_array = {}
start_time = time.time()
for tid in range(2):
t = Thread(target=my_counter)
t.start()
thread_array[tid] = t
for i in range(2):
thread_array[i].join()
# print("thread type: {}".format(prn_obj(thread_array[i])))
print("thread type: {}".format(thread_array[i].name))
end_time = time.time()
print("Total time: {}".format(end_time - start_time)) if __name__ == '__main__':
main()
下面是用了打印所有属性的方法,这个方法代码中注释了,可重复利用的代码块

二、多进程
1、multiprocessing
multiprocessing是跨平台版本的多进程模块,它提供了一个Process类来代表一个进程对象,下面是示例嗲吗
import os
if __name__=='__main__':
print 'Process (%s) start...' % os.getpid()
pid = os.fork()
print pid
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)
这个程序如果用单进程写则需要执行10秒以上的时间,而用多进程则启动10个进程并行执行,只需要用1秒多的时间。
在python中建议使用多进程而不是多线程,因为在python的多线程中有个全局解释器锁,这样在做并发效率会不是很高。
进程和进程直接可以用不同的全局解释器锁,可以提高程序效率。
2、进程间通信Queue
进程和进程之前是独立的,如果需要通信就需要Queue创建的对象来处理
from multiprocessing import Process,Queue
import time def write(q):
for i in ['A','B','C','D','E']:
print('Put %s to queue' % i)
q.put(i)
time.sleep(0.5) def read(q):
while True:
v = q.get(True)
print('get %s form queue' %v) if __name__ == '__main__':
q = Queue()
pw = Process(target=write,args=(q,))
pr = Process(target=read,args=(q,))
pw.start()
pr.start()
pr.join()
pr.terminate()

3、进程池Pool
#coding=utf-8 from multiprocessing import Pool
import time def f(x):
print x*x
time.sleep(2)
return x*x if __name__ == '__main__':
'''定义启动的进程数量'''
pool = Pool(processes=5)
res_list = [] for i in range(10):
'''
以异步并行的方式启动进程,如果要同步等待的方式,
可以在每次启动进程之后调用res.get()方法
也可以使用Pool.appley
'''
res = pool.apply_async(f,[i,])
print('--------:',i)
res_list.append(res)
pool.close()
pool.join()
for r in res_list:
print "result",(r.get(timeout=5))

三、多线程与多进程的对比
在一般情况下多个进程的内存资源是相互独立的,而多线程可以共享同一个进程中的内存资源
#coding=utf-8 from multiprocessing import Process
import threading
import time
lock = threading.Lock() def run(info_list,n):
lock.acquire()
info_list.append(n)
lock.release()
print('%s' % info_list) if __name__ == '__main__':
info = []
for i in range(10):
# target为子进程执行的函数,args为需要给函数传递的参数
p = Process(target=run,args=[info,i])
p.start()
p.join()
time.sleep(1)#这里为了输出整齐让主进程的执行等一下子进程
print('-------------------threading---------------------')
for i in xrange(1,10):
p = threading.Thread(target=run,args=[info,i])
p.start()
p.join()

Python之多线程和多进程的更多相关文章
- Python的多线程和多进程
(1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高.单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进 ...
- Python【多线程与多进程】
import time,threading print("=======串行方式.并行两种方式调用run()函数=======")def run(): print('哈哈哈') # ...
- python的多线程、多进程代码示例
python多进程和多线程的区别:python的多线程不是真正意义上的多线程,由于python编译器的问题,导致python的多线程存在一个PIL锁,使得python的多线程的CPU利用率比预期的要低 ...
- selenium +python之多线程与多进程应用于自动化测试
多线程与多进程与自动化测试用例结合起来执行,从而节省测试用例的总体运行时间. 多线程执行测试测试用例 以百度搜索为例,通过不同的浏览器来启动不同的线程. from selenium import we ...
- Python之多线程与多进程(二)
多进程 上一章:Python多线程与多进程(一) 由于GIL的存在,Python的多线程并没有实现真正的并行.因此,一些问题使用threading模块并不能解决 不过Python为并行提供了一个替代方 ...
- Python之多线程与多进程(一)
多线程 多线程是程序在同样的上下文中同时运行多条线程的能力.这些线程共享同一个进程的资源,可以在并发模式(单核处理器)或并行模式(多核处理器)下执行多个任务 多线程有以下几个优点: 持续响应:在单线程 ...
- python的多线程和多进程(一)
在进入主题之前,我们先学习一下并发和并行的概念: --并发:在操作系统中,并发是指一个时间段中有几个程序都处于启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但任一时刻点上只有一个程序在处理 ...
- Python中多线程与多进程的恩恩怨怨
概念: 并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运 ...
- python的多线程、多进程、协程用代码详解
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:刘早起早起 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...
随机推荐
- Xamarin Essentials教程地理定位Geolocation
Xamarin Essentials教程地理定位Geolocation 通过地理定位功能,应用程序可以获取用户的当前地理位置,如经纬度值.利用地理位置,可以在地图上定位,也可以转化物理位置,划分用 ...
- 移动端小坑:用户长按H5文字出现复制
禁止复制方法:*{ -webkit-user-select: none;/*禁用手机浏览器的用户选择功能 */ -moz-user-select: none; -webkit-touch-callou ...
- 2028 ACM Lowest Common Multiple Plus
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2028 思路:最一想到的就是暴力求解,从1开始一直到最后的答案,一直来除以给出的数列的数,直到余数为0:当然 ...
- Windows下bat脚本自动发邮件
摘要:说明:很多木马会利用自身的程序截取系统敏感文件或信息发往指定的邮箱,而blat并不是木马,它小巧却有强大的发邮件功能,可不要用它做违法事,感觉和木马功能有一拼!下面先看个具体的实例(在blat同 ...
- git基于某个分支创建分支
1.git checkout -b 新分支名 老分支名 git checkout -b dev_20150909 master git ls -tree 分支名字
- Spring MVC中Controller返回值void时报错
Controller如下: 当使用url访问该处理器方法时,报错如下: 26-Jan-2019 21:16:28.105 警告 [http-nio-8080-exec-39] org.springfr ...
- cena评测系统:自定义校验器(自定义评测插件编写)
Cena评测系统,最受欢迎的信息学竞赛离线评测系统. 它是开放源程序的信息学竞赛评测系统,能满足大多数程序设计竞赛的测评需求. 特色功能: 通过局域网自动收取选手程序. 高效率的数据文件配置工具. 自 ...
- [USACO18JAN]Stamp Painting
Description: Bessie想拿\(M\) 种颜色的长为\(K\) 的图章涂一个长为\(N\) 的迷之画布.假设他选择涂一段区间,则这段区间长度必须为\(K\) ,且涂完后该区间颜色全变成图 ...
- [SP10628]Count on a tree
Description: 给定一颗n个点的树,有m个询问,求任意两点路径上点权第k小的点 Hint: \(n,m<=1e5\) Solution: 比较水 以每个点到根节点的数的前缀和建主席树 ...
- BZOJ4081 : [Wf2014]Skiing
首先将目标点按$y$坐标从小到大排序. 如果加速度为$0$,那么只要贪心走一遍即可. 否则考虑DP,设$f[i][j]$表示从$i$点以速度$j$出发最多能经过多少个点. 注意到将DP值相同的合并可以 ...