一、多线程

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. 【LeetCode算法-9】Palindrome Number

    LeetCode第9题 Determine whether an integer is a palindrome. An integer is a palindrome when it reads t ...

  2. 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx.ap

    最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...

  3. CodeForces 433C Ryouko's Memory Note (中位数定理)

    <题目链接> 题目大意:给你一堆数字,允许你修改所有相同的数字成为别的数字,不过只能修改一次,问你修改后序列相邻数字的距离和最小是多少. 解题分析: 首先,修改不是任意的,否则那样情况太多 ...

  4. Junit4单元测试的基本用法

    看了一些Junit4的视频,简单了解了Junit4的一些基本用法,整理记录一下. 环境搭建 这里使用的开发工具是MyEclipse,首先新建一个Java工程,将Junit4的jar包引入,eclips ...

  5. 服务链路追踪---Sleuth

    Sleuth:日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案. 当服务与服务之间调用复杂时,Sp ...

  6. XamarinSQLite教程创建数据表

    XamarinSQLite教程创建数据表 新创建的数据库没有任何表.开发者需要手动添加数据表,并添加测试所需的数据. 1.创建数据表 为了存储数据,开发者需要添加自己的表,并设计表的结构.操作步骤如下 ...

  7. 按字典序依次打印只由1~n组成的n位数

    //我的dfs入门.将1~n一次填入数组然后打印. #include<stdio.h> #include<string.h> ]; ]; void dfs(int,int); ...

  8. Java代码优化小结(一)

    (1)尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的.为类指 ...

  9. python网络编程(十一)

    epoll版-TCP服务器 1. epoll的优点: 没有最大并发连接的限制,能打开的FD(指的是文件描述符,通俗的理解就是套接字对应的数字编号)的上限远大于1024 效率提升,不是轮询的方式,不会随 ...

  10. javaweb笔记

    (1)web项目需复制web.xml文件 (2)需要复制classes文件 需要把bin里面的com----复制到classes中