进程丶数据共享丶锁丶进程池丶模块(爬虫)

一丶进程

  1.什么是进程

    进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器.程序时指令丶数据及其组织形式的描述,进程是程序的实体.

  狭义定义:进程是正在运行的程序的实例.

  广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动 .它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元.

  2.进程和线程的区别:

    1.进程是CPU资源分配的最小单元........线程是CPU计算的最小单元

    2.一个进程中可以有多个线程

    3.对于Python来说它的进程和线程和其他语言有差异,是有GIL锁,GIL锁保证一个进程中同一时刻只有一个线程被CPU调度

  3.通过继承方式创建进程

import multiprocessing
class MyProcess(multiprocessing.Process):

    def run(self):
        print(‘当前进程‘,multiprocessing.current_process())

def run():
    p1 = MyProcess()
    p1.start()

    p2 = MyProcess()
    p2.start()

if __name__ == ‘__main__‘:
    run()
# 当前进程 <MyProcess(MyProcess-1, started)>
# 当前进程 <MyProcess(MyProcess-2, started)>

  4.使用process模块创建进程

import time
from multiprocessing import Process

def f(name):
    print(‘hello‘, name)
    print(‘我是子进程‘)

if __name__ == ‘__main__‘:
    p = Process(target=f, args=(‘bob‘,))
    p.start()
    time.sleep(1)
    print(‘执行主进程的内容了‘)

import time
from multiprocessing import Process

def f(name):
    print(‘hello‘, name)
    time.sleep(1)
    print(‘我是子进程‘)

if __name__ == ‘__main__‘:
    p = Process(target=f, args=(‘bob‘,))
    p.start()
    #p.join()
    print(‘我是父进程‘)

join方法

import os
from multiprocessing import Process

def f(x):
    print(‘子进程id :‘,os.getpid(),‘父进程id :‘,os.getppid())
    return x*x

if __name__ == ‘__main__‘:
    print(‘主进程id :‘, os.getpid())
    p_lst = []
    for i in range(5):
        p = Process(target=f, args=(i,))
        p.start()

查看进程号

  5.进程的常用功能

import time
def task(arg):
    time.sleep(2)
    print(arg)

def run():
    print(‘111111111‘)
    p1 = multiprocessing.Process(target=task,args=(1,))
    p = p1.name = ‘pp1‘
    print(p)
    p1.start()
    print(‘222222222‘)

    p2 = multiprocessing.Process(target=task, args=(2,))
    p2.name = ‘pp2‘
    p2.start()
    print(‘333333333‘)

if __name__ == ‘__main__‘:
    run()
# 111111111
# pp1
# 222222222
# 333333333
# 2
# 1

二丶数据共享

  1.进程间的数据不共享

import multiprocessing
data_list = []
def task(arg):
    data_list.append(arg)
    print(data_list)
def run():
    for i in range(10):
        p = multiprocessing.Process(target=task,args=(i,))
        p.start()

if __name__ == ‘__main__‘:
    run()

  2.进程间的数据共享multiprocessing.Queue

import multiprocessing
q = multiprocessing.Queue()

def task(arg,q):
    q.put(arg)

def run():
    for i in range(10):
        p = multiprocessing.Process(target=task, args=(i, q,))
        p.start()

    while True:
        v = q.get()
        print(v)

run()

linux

import multiprocessing
def task(arg,q):
    q.put(arg)

if __name__ == ‘__main__‘:
    q = multiprocessing.Queue()
    for i in range(10):
        p = multiprocessing.Process(target=task,args=(i,q,))
        p.start()
    while True:
        v = q.get()
        print(v)

Windows

  3.进程间的数据共享Manager

import multiprocessing
m = multiprocessing.Manager()
dic = m.dict()

def task(arg):
    dic[arg] = 100

def run():
    for i in range(10):
        p = multiprocessing.Process(target=task, args=(i,))
        p.start()

    input(‘>>>‘)
    print(dic.values())

if __name__ == ‘__main__‘:

    run()

linux

import multiprocessing
import time
def task(arg,dic):
    time.sleep(2)
    dic[arg] = 100

if __name__ == ‘__main__‘:
    m = multiprocessing.Manager()
    dic = m.dict()

    process_list = []
    for i in range(10):
        p = multiprocessing.Process(target=task, args=(i,dic,))
        p.start()

        process_list.append(p)

    while True:
        count = 0
        for p in process_list:
            if not p.is_alive():
                count += 1
        if count == len(process_list):
            break
    print(dic)
#{1: 100, 0: 100, 2: 100, 3: 100, 4: 100, 5: 100, 6: 100, 7: 100, 8: 100, 9: 100}

Windows

三丶进程锁

  线程既然有线程锁,进程肯定也有进程锁,两种锁完全一样

import time
import multiprocessing

lock = multiprocessing.RLock()

def task(arg):
    print(‘鬼子来了‘)
    lock.acquire()
    time.sleep(4)
    print(arg)
    lock.release()

if __name__ == ‘__main__‘:
    p1 = multiprocessing.Process(target=task,args=(1,))
    p1.start()

    p2 = multiprocessing.Process(target=task, args=(2,))
    p2.start()

四丶进程池

from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import os,time
def task(n):
    time.sleep(1)
    print(‘[%s] is running‘%os.getpid())
if __name__ == ‘__main__‘:
    p = ProcessPoolExecutor(3)
    for i in range(10):
        obj = p.submit(task,i).result()
    p.shutdown()  #相当于close和join方法

五丶初识爬虫

import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor

# 模拟浏览器发送请求
# 内部创建 sk = socket.socket()
# 和抽屉进行socket连接 sk.connect(...)
# sk.sendall(‘...‘)
# sk.recv(...)

def task(url):
    print(url)
    r1 = requests.get(
        url=url,
        headers={
            ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36‘
        }
    )

    # 查看下载下来的文本信息
    soup = BeautifulSoup(r1.text,‘html.parser‘)
    print(soup.text)

    content_list = soup.find(‘div‘,attrs={‘id‘:‘content-list‘})
    for item in content_list.find_all(‘div‘,attrs={‘class‘:‘item‘}):
        title = item.find(‘a‘).text.strip()
        target_url = item.find(‘a‘).get(‘href‘)
        print(title,target_url)

def run():
    pool = ThreadPoolExecutor(5)
    for i in range(1,50):
        pool.submit(task,‘https://dig.chouti.com/all/hot/recent/%s‘ %i)

if __name__ == ‘__main__‘:
    run()

爬取抽屉的信息

原文地址:https://www.cnblogs.com/qicun/p/9636164.html

时间: 2024-11-10 14:33:56

进程丶数据共享丶锁丶进程池丶模块(爬虫)的相关文章

管道,进程间数据共享,进程池

一:管道   (了解) 使用:from multiprocessing import Process,Pipe 知识: 1 创建管道时候:Pipe()默认是双工的,如改成False,那么conn1只能接收,conn2只能发送. conn1,conn2=Pipe() 2 Pipe模块发送字符串不用bytes类型,直接是字符串类型. Pipe([duplex]):在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1, conn2表示管道两端的连接对象,强调一点:必须在产生Pr

python GIL锁、进程池与线程池、同步异步

一.GIL全局解释器锁 全局解释器锁 在CPython中,全局解释器锁(GIL)是一个互斥锁,它可以防止多个本机线程同时执行Python代码.之所以需要这个锁,主要是因为CPython的内存管理不是线程安全的.(然而,自从GIL存在以来,其他特性已经逐渐依赖于它所执行的保证) 什么是GIL 全局解释器锁, 施加在解释器上的互斥锁 为什么需要GIL 由于CPython的内存管理时非线程安全,于是CPython就给解释器加上锁, 解决了安全问题. GIL的加锁与解锁时机 加锁的时机: 在调用解释器时

python第三十七天,GIL全局解释器锁*****,线程池与进程池 同步异步,阻塞与非阻塞,异步回调

GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe

第35篇 进程之间的通信 Queue Pipe 进程池Pool,p.apply()方法,p.apply_async()方法

内容大纲: 进程之间的通讯 进程队列 管道 进程之间的数据共享 进程池 使用进程池 开启进程 提交任务 获得返回值 回调函数1.进程队列 先进先出 from multiprocessing import Queue import queue q = Queue() q.put(1) q.put(2) q.put(3) print(q.get()) print(q.get()) print(q.get()) 1 2 3 from multiprocessing import Queue impor

通过SharedPreferences实现进程间数据共享的问题详解

??之前为了解决应用的内存压力,在同一个应用中使用了多进程,但在程序自测的过程中发现不同进程之间的SharedPreferences数据不能共享,但应用内很多数据都是通过SharedPreferences来保存的,如果改成其它多进程通信的方式改动比较大.通过查看源码发现,在API Level>=11即Android 3.0可以通过Context.MODE_MULTI_PROCESS属性来实现SharedPreferences多进程共享,具体使用方式如下: SharedPreferences sp

python全栈开发 * 进程之间的通信,进程之间数据共享 * 180726

进程之间的通信(IPC)队列和管道一.队列 基于管道实现 管道 + 锁 数据安全(一).队列 队列遵循先进先出原则(FIFO) 多用于维护秩序,买票,秒杀 队列的所有方法: put()(给队列里添加数据),put_nowait(), get()(从队列中获取数据),get_nowait(), 相同点:有值的时候取值 区别:get()没有值时会阻塞 get_nowait() 没有值时会报错 full()(返回布尔值),empty()(返回bool值), qsize()(队列大小) 示例: from

Python之路(第三十九篇)管道、进程间数据共享Manager

一.管道 概念 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信. 先画一幅图帮助大家理解下管道的基本原理 现有2个进程A和B,他们都在内存中开辟了空间,那么我们在内存中再开辟一个空间C,作用是连接这两个进程的.对于进程来说内存空间是可以共享的(任何一个进程都可以使用内存,内存当中的空间是用地址来标记的,我们通过查找某一个地址就能找到这个内存)A进程可以不断的向C空间输送东西,B进程可以不断的从C空间读取东西,这

oracle查看锁表进程,杀掉锁表进程

查看锁表进程SQL语句1: select sess.sid,     sess.serial#,     lo.oracle_username,     lo.os_user_name,     ao.object_name,     lo.locked_mode     from v$locked_object lo,     dba_objects ao,     v$session sess where ao.object_id = lo.object_id and lo.session_

oracle查看被锁的表和被锁的进程,杀掉进程

-- 1. 查看被锁的表 SELECT p.spid, a.serial#, c.object_name, b.session_id, b.oracle_username,b.os_user_name FROM v$process p, v$session a, v$locked_object b, all_objects c WHERE p.addr = a.paddr AND a.process = b.process AND c.object_id = b.object_id -- 2.