1、    进程和线程的区别:

(1) 一个进程可以有多个线程,一个进程中的多个线程共享该进程的所有资源,多线程切换比多进程切换快,因为不用上下文切换,Python中并发建议用多进程

(2) 进程是资源分配的最小单位,线程是程序执行的最小单位

(3) 进程有自己的独立地址空间,而线程是共享进程中的数据

2、    并行和并发:并行指在某一秒,并发指在某一时间段

3、    Pip list 查看各API版本号

4、    守护线程:比如主线程A中创建了子线程B,并且在主线程A中调用了B.setDeamon(),意思是,把B设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出。这就是 setDaemon方法的含义, 这基本和 join是相反的。此外,还有个要特别注意必须在 start()方法调用之前调用此方法,如果不设置为守护线程程序有可能会被无线挂起

5、    线程创建的方法:

(1) threading.Thread创建

(2) 通过继承Thread类创建线程 : class MyThread(threading.Thread)

6、    线程拥有的方法:

(1) isAlive() 返回线程是否在运行。运行指启动后,结束前。

(2) getName() 获取线程名字

(3) setName() 设置线程名字

(4) isDeamon() 判断线程是否随主线程一起结束

(5) setDeamon() 设置是否为守护线程

(6) start() 启动线程

(7) join() 等待所有子线程执行完后才能接着往下执行

(8) run() 用于表示线程活动的方法,通常需要重写

(9) pool.map()

7、    并发线程的两种关系:同步与互斥

(1) 锁可以实现线程间的互斥

(2) 生产者和消费者是线程同步的例子

8、    线程加锁:threading.Semaphore()

#练习:守护进程
import multiprocessing
import time, logging
import sys def daemon():
p = multiprocessing.current_process()
print 'Starting:', p.name, p.pid
sys.stdout.flush() # 将缓冲区数据写入终端
# time.sleep()
print 'Exiting :', p.name, p.pid
sys.stdout.flush() def non_daemon():
p = multiprocessing.current_process()
print 'non_Starting:', p.name, p.pid
sys.stdout.flush()
print 'non_Exiting :', p.name, p.pid
sys.stdout.flush() if __name__ == '__main__':
# 设置日志输出到控制台
multiprocessing.log_to_stderr()
logger = multiprocessing.get_logger()
# 设置输出日志的级别
logger.setLevel(logging.DEBUG) d = multiprocessing.Process(name='daemon', target=daemon)
d.daemon = True
n = multiprocessing.Process(name='non-daemon', target=non_daemon)
n.daemon = False
d.start()
time.sleep()
n.start()
# d.join()
# n.join()
print 'd.is_alive()', d.is_alive()
print "n.is_alive()", n.is_alive()
print "main Process end!" #练习:线程池 import time
from multiprocessing.dummy import Pool as ThreadPool
#ThreadPool表示给线程池取一个别名ThreadPool def run(fn):
time.sleep()
print fn if __name__ == "__main__":
testFL = [,,,,]
#创建10个容量的线程池并发执行
pool = ThreadPool()
pool.map(run,testFL)
pool.close()
pool.join() #练习:锁可以实现线程间的互斥
import threading
import time data =
lock = threading.Lock()#创建一个锁对象 def func() :
global data
print "%s acquire lock...\n" %threading.currentThread().getName()
if lock.acquire : #if 1:改成这个耗时会长
print "%s get lock...\n" %threading.currentThread().getName()
for i in range():
data += #must lock
#time.sleep()#其它操作
print "%s release lock...\n" %threading.currentThread().getName() #调用release()将释放锁
#lock.release() startTime = time.time()
t1 = threading.Thread(target = func)
t2 = threading.Thread(target = func)
t3 = threading.Thread(target = func)
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
print data endTime = time.time()
print "used time is", endTime - startTime #练习:线程同步
from Queue import Queue #队列类
import random
import threading
import time #生成者线程
class Producer(threading.Thread):
def __init__(self, t_name, queue):
#调用父线程的构造方法。
threading.Thread.__init__(self, name = t_name)
self.data = queue def run(self):
for i in range():
print "%s: %s is producing %d to the queue!\n" %(time.ctime(), self.getName(), i)
self.data.put(i)#向队列中添加数据
#产生一个0-2之间的随机数进行睡眠
time.sleep(random.randrange() / )
print "%s: %s finished!" %(time.ctime(), self.getName())
#消费者线程
class Consumer(threading.Thread):
def __init__(self, t_name, queue):
threading.Thread.__init__(self, name = t_name)
self.data = queue def run(self):
for i in range():
val = self.data.get()#从队列中取出数据
print "%s: %s is consuming. %d in the queue is consumed!\n" %(time.ctime(), self.getName(), val)
time.sleep(random.randrange())
print "%s: %s finished!" %(time.ctime(), self.getName()) #Main thread
def main():
queue = Queue()#创建一个队列对象(特点先进先出)
producer = Producer('Pro.', queue)#生产者对象
consumer = Consumer('Con.', queue)#消费者对象
producer.start()
consumer.start()
producer.join()
consumer.join()
print 'All threads terminate!' if __name__ == '__main__':
main() #练习:线程锁
from threading import Thread, Lock
import threading def run(lock, num):
lock.acquire() # 获得锁
# 取得当前线程的线程名
threadName = threading.current_thread().getName()
print "%s, Hello Num: %s" %(threadName, num)
lock.release() # 释放锁 if __name__ == '__main__':
lock = Lock() # 创建一个共享锁实例
for num in range():
Thread(name = 'Thread-%s' %str(num), target = run, args = (lock, num)).start() #练习:多把线程锁
from threading import Thread,Lock
import threading
import time def worker(s,i):
s.acquire()
print(threading.current_thread().name + " acquire")
time.sleep(i)
print(threading.current_thread().name + " release")
s.release() if __name__=="__main__":
s=threading.Semaphore()
for i in range():
t=Thread(target=worker,args=(s,i*))
t.start()
#t.join #这里加了join就会逐个执行了

【Python】多线程-2的更多相关文章

  1. python多线程学习记录

    1.多线程的创建 import threading t = t.theading.Thread(target, args--) t.SetDeamon(True)//设置为守护进程 t.start() ...

  2. python多线程编程

    Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...

  3. Python 多线程教程:并发与并行

    转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...

  4. python多线程

    python多线程有两种用法,一种是在函数中使用,一种是放在类中使用 1.在函数中使用 定义空的线程列表 threads=[] 创建线程 t=threading.Thread(target=函数名,a ...

  5. python 多线程就这么简单(转)

    多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...

  6. python 多线程就这么简单(续)

    之前讲了多线程的一篇博客,感觉讲的意犹未尽,其实,多线程非常有意思.因为我们在使用电脑的过程中无时无刻都在多进程和多线程.我们可以接着之前的例子继续讲.请先看我的上一篇博客. python 多线程就这 ...

  7. python多线程监控指定目录

    import win32file import tempfile import threading import win32con import os dirs=["C:\\WINDOWS\ ...

  8. python多线程ssh爆破

    python多线程ssh爆破 Python 0x01.About 爆弱口令时候写的一个python小脚本,主要功能是实现使用字典多线程爆破ssh,支持ip表导入,字典数据导入. 主要使用到的是pyth ...

  9. 【python,threading】python多线程

    使用多线程的方式 1.  函数式:使用threading模块threading.Thread(e.g target name parameters) import time,threading def ...

  10. <转>Python 多线程的单cpu与cpu上的多线程的区别

    你对Python 多线程有所了解的话.那么你对python 多线程在单cpu意义上的多线程与多cpu上的多线程有着本质的区别,如果你对Python 多线程的相关知识想有更多的了解,你就可以浏览我们的文 ...

随机推荐

  1. java 类加载机制和反射机制

    一.类的加载机制 jvm把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成jvm可以直接使用的java类型的过程.(1)加载         将class文件字节码内容加载到内存中, ...

  2. python-django缓存

    三 Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的 ...

  3. SpringBoot项目Shiro的实现(一)

    一.Shiro的简单介绍 Shiro是Apache下的一个开源项目,我们称之谓Apache Shiro,它是一个易用与Java项目的安全框架,提供了认证.授权.加密.会话管理,与Spring Secu ...

  4. Beta阶段——第1篇 Scrum 冲刺博客

    第1篇 Scrum 冲刺博客 a. 介绍小组新加入的成员,Ta担任的角色. 新加入成员 郭炜埕 原先担任的角色 前端界面设计 现在担任的角色 前端开发,并协助后端开发 新加成员介绍 炜埕同学对界面设计 ...

  5. [luogu P1438] 无聊的数列

    [luogu P1438] 无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个 ...

  6. shell历史简介

    shell也叫做终端.命令行. shell的基本作用是供用户输入命令.解析用户所输入命令.呈现命令执行结果. shell有多种不同的shell其语法会有差异,这也是严谨的sh文件会在首行以“#!/bi ...

  7. Struts 2 初步入门(一)

    搭建Struts 2环境步骤 下载jar包----->创建web项目---->创建并完善相关配置文件---->创建action并测试启动 下载jar包访问网站:http://stru ...

  8. linux网络连接--桥接bridge,NAT,host-only的区别

    linux网络连接主要分为三种:桥接,net,host_only 桥接使用的是真实网卡,电脑里面有两种真实网卡,有线网卡,无线网卡,当你使用的是无线连接, 则选择无线网卡,使用网线连接,则选择有线网卡 ...

  9. Win10系列:JavaScript 控件的使用

    向页面中添加的控件可分为两种类型:标准的HTML控件和WinJS库控件.其中标准的HTML控件是指HTML标准中定义的基本控件,如按钮和复选框:WinJS库控件是为开发基于JavaScript 的Wi ...

  10. 尚学堂java 参考答案 第七章

    本答案为本人个人编辑,仅供参考,如果读者发现,请私信本人或在下方评论,提醒本人修改 一.选择题 1.ACD 解析:B:java中左边不能直接直接指定长度,和C语言不一样 2.B 3.C 解析:B各行分 ...