Python Six_Day

  • 进程
    进程各有独立的内存空间
import multiprocessing
import os
		
def info(title):
    print(title)
    print(__name__)
    print('father', os.getppid())
    print('self', os.getpid())
    print('--------')
	
if __name__ == "__main__": # 除了创建的子进程和子进程调用函数,其他的都是脚本主进程
    # info('hello')
    # 创建一个子进程调用函数
    P = multiprocessing.Process(target=info,args=('hello python',))
    P.start()
    P.join() # 和多线程一样,也是等待的意思
    print('hello word') # 若没有join则会独立运行
运行结果:
	hello python
	__mp_main__
	father 17052
	self 16724
	--------
	hello word
  • 多进程,并发,可能乱序并发执行(主要看系统如何处理)
  • 多进程加锁,挨个执行,也可能是乱序

import os
import multiprocessing
import time

def showdata(lock, i):
   with lock:
       print(multiprocessing.current_process().name)
       time.sleep(2)
       print(i)


if __name__ == "__main__":
   lock = multiprocessing.RLock()  # 创建锁
   for num in range(10):
       multiprocessing.Process(target=showdata, args=(lock, num)).start()

eg2:
import multiprocessing
import os
import time
	
def info(title):
    print(title)
    time.sleep(2)
    print(__name__)
    print('father', os.getppid())
    print('self', os.getpid())
    print('--------')
	
if __name__ == "__main__":
    p1 = multiprocessing.Process(target=info,args=('A1',))
    p2 = multiprocessing.Process(target=info, args=('A2',))
    p3 = multiprocessing.Process(target=info, args=('A3',))
    p1.start()
    p2.start()
    p3.start()
    p1.join()
    p2.join()
    p3.join()
    # 这里的join只是为了卡住主进程,使得三个进程都执行完毕再执行print
    # 这里很重要,以后多进程扫描文件需要完全等待几个进程全部执行完毕在汇总
    print('all over')
    '''

进程通信(管道)

import multiprocessing

def A(conn):#conn表示管道类型
    while 1:
        # conn.send(['a','b','c','d'])
        print('A',conn.recv())#收到数据
        # conn.close()#关闭
if __name__ == "__main__":
    conn_a,conn_b = multiprocessing.Pipe()#创建一个管道含有两个口
    p = multiprocessing.Process(target=A,args=(conn_a,))#创建子进程
    p.start()
    while 1:
        input_ = input('>>')
        conn_b.send(input_)#发送消息给A
        # print('main',conn_b.recv())全局变量进程不可以共享,队列可以进程共享

聊天系统

import multiprocessing
def computer(conn):
    recv_ = conn.recv()
    print('电脑收到:%s'%recv_)
    if recv_ == "你好":
        conn.send('不好')
def person(conn):
    input_ = input('人说:')
    conn.send(input_)

if __name__ == "__main__":
    conn_computer,conn_person = multiprocessing.Pipe()#创建管道
    p_computer = multiprocessing.Process(target=computer,args=(conn_computer,))#创建子进程
    p_computer.start()
    person(conn_person) 
  • Queue对象
    队列对象 (Queue, LifoQueue, 或者 PriorityQueue) 提供下列描述的公共方法。

  • Queue.qsize()
    返回队列的大致大小。

  • Queue.empty()
    如果队列为空,返回 True ,否则返回 False 。

  • Queue.full()
    如果队列是满的返回 True ,否则返回 False 。

  • Queue.put(item, block=True, timeout=None)
    将 item 放入队列。

  • Queue.put_nowait(item)
    相当于 put(item, False) 。

  • Queue.get(block=True, timeout=None)
    从队列中移除并返回一个项目。

  • Queue.get_nowait()
    相当于 get(False) 。

  • Queue.join()
    阻塞至队列中所有的元素都被接收和处理完毕。

进程列表数组共享

import multiprocessing


def func(num):
    num[2] = 9999


if __name__ == '__main__':
    # 不同进程之间实现数组共享
    num = multiprocessing.Array('i', [1, 2, 3, 4, 5, 6])  # i代表int类型
    print(num[:])
    p = multiprocessing.Process(target=func, args=(num,))
    p.start()
    p.join()
    print(num[:])

全局变量不可以进程共享

进程字典列表共享

import multiprocessing


def func(mydict, mylist):
    mydict["胡旺"] = "牛皮"
    mydict["lalal"] = "大美女"
    mylist.append(11)
    mylist.append(22)
    mylist.append(33)


if __name__ == "__main__":
    # with multiprocessing.Manager() as MG:
    #     mydict=MG.dict()
    #     mylist=MG.list(range(5))
    mydict = multiprocessing.Manager().dict()
                                        # [0,1,2,3,4]
    mylist = multiprocessing.Manager().list(range(5))

    p = multiprocessing.Process(target=func, args=(mydict, mylist))
    p.start()
    p.join()

    print(mylist)
    print(mydict)

get的性质:
取不到东西会一直等待

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值