一、多线程

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之多线程和多进程的更多相关文章

  1. Python的多线程和多进程

    (1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高.单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进 ...

  2. Python【多线程与多进程】

    import time,threading print("=======串行方式.并行两种方式调用run()函数=======")def run(): print('哈哈哈') # ...

  3. python的多线程、多进程代码示例

    python多进程和多线程的区别:python的多线程不是真正意义上的多线程,由于python编译器的问题,导致python的多线程存在一个PIL锁,使得python的多线程的CPU利用率比预期的要低 ...

  4. selenium +python之多线程与多进程应用于自动化测试

    多线程与多进程与自动化测试用例结合起来执行,从而节省测试用例的总体运行时间. 多线程执行测试测试用例 以百度搜索为例,通过不同的浏览器来启动不同的线程. from selenium import we ...

  5. Python之多线程与多进程(二)

    多进程 上一章:Python多线程与多进程(一) 由于GIL的存在,Python的多线程并没有实现真正的并行.因此,一些问题使用threading模块并不能解决 不过Python为并行提供了一个替代方 ...

  6. Python之多线程与多进程(一)

    多线程 多线程是程序在同样的上下文中同时运行多条线程的能力.这些线程共享同一个进程的资源,可以在并发模式(单核处理器)或并行模式(多核处理器)下执行多个任务 多线程有以下几个优点: 持续响应:在单线程 ...

  7. python的多线程和多进程(一)

    在进入主题之前,我们先学习一下并发和并行的概念: --并发:在操作系统中,并发是指一个时间段中有几个程序都处于启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但任一时刻点上只有一个程序在处理 ...

  8. Python中多线程与多进程的恩恩怨怨

    概念: 并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运 ...

  9. python的多线程、多进程、协程用代码详解

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:刘早起早起 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

随机推荐

  1. 比较对象--"=="与"equal"的区别

    String stra=new String("你好"); String strb=new String("你好"); String strc=stra; bo ...

  2. hdu 1263 水果 【二维map】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1263 题目大意: Problem Description 夏天来了~~好开心啊,呵呵,好多好多水果~~ ...

  3. hash碰撞POC

    hash碰撞POC: 该类型漏洞POC编写过程难点有二: 一. hash碰撞数据的产生或收集 二. 使用responseTime来判断是否存在hash,如何精确的得到 三. 如何估算出服务器的处理/响 ...

  4. CUDA版Grabcut的实现

    在上次用 CUDA实现导向滤波 后,想着导向滤波能以很小的mask还原高分辨率下的边缘,能不能搞点事情出来,当时正好在研究Darknet框架,然后又看到grabcut算法,用opencv试了下,感觉效 ...

  5. sql - 递归update

    declare v_rlt ):; l_sql ); -- variable that contains a query l_c sys_refcursor; -- cursor variable(w ...

  6. 打造利器Qt Creator:代码todo工具的使用

    http://blog.csdn.net/maobush/article/details/67636734

  7. BZOJ.3165.[HEOI2013]Segment(李超线段树)

    BZOJ 洛谷 对于线段,依旧是存斜率即可. 表示精度误差一点都不需要管啊/托腮 就我一个人看成了mod(10^9+1)吗.. //4248kb 892ms #include <cstdio&g ...

  8. Codeforces.954I.Yet Another String Matching Problem(FFT)

    题目链接 \(Description\) 对于两个串\(a,b\),每次你可以选择一种字符,将它在两个串中全部变为另一种字符. 定义\(dis(a,b)\)为使得\(a,b\)相等所需的最小修改次数. ...

  9. Tapable.plugin is deprecated. Use new API on `.hooks` instead

    问题描述 在使用extract-text-webpack-plugin给webpack打包时出现报错 Tapable.plugin is deprecated. Use new API on `.ho ...

  10. C++程序设计方法3:禁止自动类型转换

    禁止自动类型转换 explicit #include <iostream> using namespace std; class Src;//前置类型声明,因为在Dst中要用到Src的类 ...