一、进程
进程:一个程序要运行时所需的所有资源的集合
进程是资源的集合,相当于一个车间 一个进程至少需要一个线程,这个线程为主线程
一个进程里可以有多个线程 cpu cores越多,代表着你可以真正并发的线程越多 2个进程之间的数据是完全独立的,互相不能访问
1.进程lock
 from multiprocessing import Process, Lock

 def f(l, i):
l.acquire()
try:
print('hello world', i)
finally:
l.release() if __name__ == '__main__':
lock = Lock() for num in range(10):
Process(target=f, args=(lock, num)).start()

2.进程池

 from multiprocessing import Process, Lock,Pool
import time def f(i):
# l.acquire()
# try:
print('hello world %s'%i)
time.sleep(1)
# finally:
# l.release()
return i def Bar(data):
print(data)
if __name__ == '__main__':
lock = Lock()
pool = Pool(processes=5)
for num in range(10):
# Process(target=f, args=(lock, num)).start()
pool.apply_async(func=f,args=(num,),callback=Bar)
pool.close()
pool.join()

3.进程间通信

 from multiprocessing import Process, Queue

 def f(q):
q.put([42, None, 'hello']) if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print(q.get()) # prints "[42, None, 'hello']"
p.join()

3.多进程

 from multiprocessing import Process
import time def f(name):
time.sleep(2)
print('hello', name) if __name__ == '__main__':
for i in range(10):
p = Process(target=f, args=('bob',))
p.start()
# p.join()
二、线程
线程:
一个单一的指令的控制流,寄生在进程中 单一进程里的多个线程是共享数据的 多线程在涉及修改同一数据时一定要加锁 自己总结:(宏观并发,时间片切换比进程快),多核编程
1.线程
 import threading
import time
def run(n):
time.sleep(1)
# print(threading.get_ident())
print("thread",n)
print(threading.current_thread())
for i in range(10):
t = threading.Thread(target=run, args=(i,))
t.start()
# t.setName(i)
print(t.getName()) print(threading.active_count())
# t = threading.Thread(target=run,args=(1,))
# t.start()
# t2 = threading.Thread(target=run,args=(2,))
# t2.start()
print(threading.current_thread())
time.sleep(1.5) print(threading.active_count())

2.线程lock.py

 import threading
import time
def run(n):
global num
l.acquire()#获取锁
num = num + 1
time.sleep(1)
l.release()#释放锁
print(num)
# print("thread",n)
def run2():
count = 0
while num < 9:
print('---', count)
count +=1 l = threading.Lock() #定义锁 num = 0
t_list = []
for i in range(10):
t = threading.Thread(target=run, args=(i,))
t.start()
t_list.append(t)
t2 = threading.Thread(target=run2)
t2.start() for t in t_list:
t.join() print('----main Thread----')
print(num)

3.线程等待

 import threading
import time
def run(n):
time.sleep(1)
print("thread",n) t_list = [] for i in range(10):
t = threading.Thread(target=run, args=(i,))
t.start()
t_list.append(t)
# t.join()
for t in t_list:
t.join() print('----main Thread----')

生产者消费者的两个主要作用
1.程序的解耦合,异步
2.提高了程序的运行效率
 import threading
import queue
import time
def consumer(name): while True:
print("%s 取到骨头[%s]吃了" %(name,q.get()))
time.sleep(0.5)
q.task_done()
def producer(name):
count = 0
# while q.qsize() < 5:
for i in range(10):
print("%s生成了骨头"%name,count)
q.put(count)
count +=1
time.sleep(0.3)
q.join()
print("------chiwan--------")
q = queue.Queue(maxsize = 4) p = threading.Thread(target=producer,args=('alex',))
# p2 = threading.Thread(target=producer,args=('aaa',))
c = threading.Thread(target=consumer,args=('qqq',))
p.start()
# p2.start()
c.start()

Python之路,day10-Python基础的更多相关文章

  1. Python之路,Day4 - Python基础4 (new版)

    Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...

  2. Python之路,Day1 - Python基础1

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...

  3. Python之路,Day10 - 异步IO\数据库\队列\缓存

    Python之路,Day9 - 异步IO\数据库\队列\缓存   本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...

  4. Python之路,Day1 - Python基础1(转载Alex)

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...

  5. Python之路,Day1 - Python基础1 --转自金角大王

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...

  6. Python之路,Day1 - Python基础1 介绍、基本语法、流程控制

    本节内容 1.python介绍 2.发展史 3.python 2.x or python 3.x ? 4.python 安装 5.第一个程序 Hello World 程序 6.变量 7.用户输入 8. ...

  7. python之路-Day10

    操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 ...

  8. Python全栈day10(基础知识练习题)

    一,执行python的两种方式 1,写在脚本里面调用python执行,例如python test.py 2,  输入python在命令行交互执行,例如 python  >>> pri ...

  9. Python之路:Python简介

    Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间他为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承 ...

  10. Python之路:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

随机推荐

  1. <textarea>使用的时候发现的两个问题的总结

    在练习表单的过程中,使用<textarea>时,遇到2个问题: 1.文本开始前有好多空格. 原来的代码是这样的: <textarea row="20" col=& ...

  2. Windows Phone开发需要了解的背景

    在Windows Phone8.1之前,Windows Phone应用是基于Silverlight的,这些代码也不能在Windows上运行,从Windows Phone8.1开始,开发者多了一个选择, ...

  3. 用profile分析算法性能

    在命令行输入:profile viewer 会出现如下图所示探查器: 在运行此代码的后面的输入框中输入要运行的程序,然后点击启动探查,就会自动探查. 探查结束之后,会给出每个函数的调用次数.运行时间等 ...

  4. Java收藏

    1.某大神的cnblogs博客关于java的随笔分类:http://www.cnblogs.com/viviman/category/444566.html 2.某大神的cnblogs博客关于java ...

  5. volatile关键字和mutable关键字

    如果不用volatile关键字会如何?可能会造成一个后果就是:编译器发现你多次使用同一个变量的值,然后它可能会假设这个变量是不变的值,并且把这个变量的值放入寄存器中,方便下一次使用,提高存取速度. 一 ...

  6. nosql->redis学习 数据类型

    redis->string 二进制 setnx name lijie  判断键值 是否存在  如果存在返回0 不存在 吧值设置进去   setex  指定键值有效期时间  setex name ...

  7. 兼容各版本浏览器,封装原生Js获取ClassName

    web前端开发工作中常常会用到获取元素的className,用jQuery的$(".class")方法也可以获取className,但是有时候牵扯到数据而影响的加载顺序的原因会获取 ...

  8. iOS 渐变进度条

    #import <UIKit/UIKit.h> @interface JianBianView : UIView //为了增加一个表示进度条的进行,可们可以使用mask属性来屏蔽一部分 @ ...

  9. opensuse 13.1 安装配置从0开始

    主要目的为自己留作备份,仅作参考! 1. 输入法 托盘->输入法->配置 去掉除英语和Sunpinyin之外的输入法,配置Sunpinyin,使用双拼方案,重启fcitx. 另外需要禁用笔 ...

  10. 关于Android 应用保活

    通常情况下 , 公司需要让自己的产品在用户的手机中尽可能存活长的时间,包括不受大数字,手动清理后台等情况的影响.这里给出一种方式 就是 双进程守护: 模型如图所示: 两个service通过aidl的方 ...