python之路——37

复习

1.同步、异步、阻塞、非阻塞    同步:所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列    异步:所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。    阻塞:等待者除了等待消息通知之外不能做其它的事情,那么该机制就是阻塞的,表现在程序中,也就是该程序一直阻塞在该函数调用处不能继续往下执行。    非阻塞:因为他(等待者)没有阻塞在这个消息通知上,而是一边做自己的事情一边等待。

学习内容

1.进程的生命周期    1.代码执行结束,进程结束    2.主进程结束而子进程未结束,则主进程等待子进程结束再结束    3.子进程的存在不一定依赖父进程

代码区

1.起多进程

from multiprocessing import Process
import os

def func(args):
    print(args)
    print(‘子进程: %s‘%os.getpid())
    print(‘子进程的父进程: %s‘ % os.getppid())
    print(123)

if __name__ == ‘__main__‘:
    p = Process(target=func, args=(‘sd‘,))  # 注册
    #  p是一个进程对象,未启动
    p.start()  # 开启子进程
    print(‘父进程: %s‘ % os.getpid())
    print(‘父进程的父进程: %s‘ % os.getppid())
    print(‘*‘*10)

2.多进程的join方法

from multiprocessing import Process
import time

def func(arg1,arg2):
    print(‘*‘*arg1)
    time.sleep(5)
    print(‘*‘*arg2)

if __name__ == ‘__main__‘:
    p = Process(target=func, args=(10, 20))
    p.start()
    p.join()  # 感知一个子进程的结束,将异步改为同步
    print(‘=====:运行完了‘)

3.多进程合并

from multiprocessing import Process
import time

def func(arg1,arg2):
    print(‘*‘*arg1)
    time.sleep(5)
    print(‘*‘*arg2)

if __name__ == ‘__main__‘:
    p_lst = []
    for i in range(10):
        p1 = Process(target=func, args=(10*i, 20*i))
        p_lst.append(p1)
        p1.start()
    [p1.join() for p1 in p_lst]
    print(‘yuncing‘)

4.面向对象调多进程

from multiprocessing import Process
import os

class MyProcess(Process):
    def __init__(self,arg1):
        super().__init__()
        self.arg1 = arg1
    def run(self):
        print(self.name)
        print(self.pid)
        print(self.arg1, ‘参数‘)
        print(os.getpid())

if __name__ == ‘__main__‘:
    print(‘主进程:‘, os.getpid())
    p1 = MyProcess(1)
    p1.start()
    p2 = MyProcess(1)
    p2.start()

5.进程间数据隔离

from multiprocessing import Process
import os

def func():
    global n
    n = 0
    print(‘pid: %s‘%os.getpid(), n)

if __name__ == ‘__main__‘:
    n = 100
    p = Process(target=func)
    p.start()
    p.join()
    print(os.getpid(),n)

6.守护进程——随着主程序的代码执行完毕而结束

from multiprocessing import Process
import time

def func():
    while 1:
        time.sleep(1)
        print(‘copy that‘)

# def func():
#     print()

if __name__ == ‘__main__‘:
    p = Process(target=func)
    # p.daemon = True
    p.start()
    i = 0
    while i < 3:
        print(‘i am socketserver‘)
        time.sleep(5)
        i += 1
        print(i)

7.买车票——程序锁

from multiprocessing import Process
import json
import time
from multiprocessing import Lock

def show(i):
    with open(‘ticket‘) as f:
        dic = json.load(f)
    print(‘余票:%s‘%dic[‘ticket‘])

def buy_ticket(i,lock):
    lock.acquire()
    with open(‘ticket‘) as f:
        dic = json.load(f)
        time.sleep(0.1)
    if dic[‘ticket‘] > 0:
        dic[‘ticket‘] -= 1
        print(‘\033[32m %s OK!!!\033[0m‘%i)
    else:
        print(‘\033[31m %s NO!!!\033[0m‘%i)
    time.sleep(0.1)
    with open(‘ticket‘,‘w‘) as f:
        json.dump(dic,f)
    lock.release()

if __name__ == ‘__main__‘:
    for i in range(10):
        p = Process(target=show,args=(i,))
        p.start()
    lock = Lock()
    for i in range(10):
        p = Process(target=buy_ticket,args=(i,lock))
        p.start()

原文地址:https://www.cnblogs.com/wan2-0/p/10876825.html

时间: 2024-07-30 17:19:28

python之路——37的相关文章

Python之路【第十七篇】:Django【进阶篇 】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memc

Python之路【第三篇】:Python基础(二)

Python之路[第三篇]:Python基础(二) 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作.

Python之路【第二篇】:Python基础(一)

Python之路[第二篇]:Python基础(一) 入门知识拾遗 一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1:     name = 'wupeiqi' print  name 下面的结论对吗? 外层变量,可以被内层变量使用 内层变量,无法被外层变量使用 二.三元运算 1 result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为假:result = 值2 三.进制 二进制,01 八进

Python之路【第十九篇】:爬虫

Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. Requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. import

Python之路【第八篇】:堡垒机实例以及数据库操作

Python之路[第八篇]:堡垒机实例以及数据库操作 堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: + import paramiko transport = paramiko.Transport(('hostname', 22)) transport.connect(username='wupeiqi', password='123') ssh

Python之路【第十五篇】:Web框架

Python之路[第十五篇]:Web框架 Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/usr/bin/env python #coding:utf-8   import socket   def handle_request(client):     buf = client.recv(10

Python之路【第十七篇】:Django之【进阶篇】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

Python之路【第十八篇】:Web框架们

Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. 1 2 3 4 pip install bottle easy_install bottle apt-get install python-bottle wget http://bottlepy.org/bottle.py Bottle框架大致可以分为以下部分: 路