notas de estudio Python --Day06

notas de estudio Python --Day06

Después de un lapso de tiempo sexto día, aceite, combustible y proceso de hilo para hacer hoy

Proceso y Tema

Proceso (proceso) es un programa de ordenador se ejecuta en un conjunto de datos sobre las actividades del sistema es la unidad básica de la asignación de recursos y la programación, es la arquitectura del sistema operativo subyacente. Una vez que el proceso es la unidad básica del sistema operativo de tiempo compartido operación. En la arquitectura de computadores temprano en el diseño orientado a los procesos (por ejemplo, a principios de UNIX, Linux2.4 y anteriores), el proceso básico es el programa de entidad de ejecución, la arquitectura del ordenador en el hilo contemporáneo en el diseño para el (los sistemas operativos más modernos, Linux2. 6 y versiones posteriores), el proceso en sí mismo no es el funcionamiento básico de la unidad, pero el hilo del recipiente. Programa es la instrucción, la organización de los datos y su descripción del proceso se ejecuta realmente instancia del programa. Puede haber varios procesos asociados con el Departamento del mismo programa, y cada proceso puede ser tanto en modo síncrono o asíncrono de forma independiente. sistemas informáticos modernos pueden ser al mismo tiempo en forma de una pluralidad de programas de proceso cargados en memoria.
El hilo (Inglés: hilo) es la unidad más pequeña de un sistema operativo capaz de operación de planificación. Se incluye en el proceso, la operación real del proceso de unidad. Un hilo refiere a un único flujo de control de una secuencia de proceso, un proceso puede complicarse por una pluralidad de hilos, cada hilo en paralelo para realizar diferentes tareas. En el SunOS Unix System V y también se conoce como procesos ligeros (procesos ligeros), pero proceso más ligero se refiere a los hilos del núcleo (kernel) de rosca, mientras el hilo de usuario (hilo usuario) llama roscas.

El concepto propuesto

El proceso se introdujo por primera vez a principios de la década de 1960 por el sistema del MIT MULTICS y 360 del sistema / CTSS de IBM.

características del proceso

  • Dinámica: la esencia del proceso es una ejecución multi-canal del programa en el sistema operativo, el proceso se genera dinámicamente, la extinción dinámica.
  • Concurrencia: cualquier proceso puede ser ejecutado simultáneamente con otros procesos junto
  • proceso de unidad independiente es una unidad básica puede funcionar de forma independiente, sino también la asignación de recursos del sistema y programación: la independencia
  • naturaleza asíncrona: debido a la interacción entre los procesos, de manera que el proceso se ha realizado de forma intermitente, es decir, de acuerdo con el proceso de la velocidad independiente, impredecible adelante
    características estructurales: tres bloques de parte del programa de control de procesos, datos, y procesos

El multi-proceso de Python

Echemos un vistazo a un ejemplo de un proceso único

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:单进程举例
from random import randint
from time import sleep, clock


def play_video(videoname):
    print("开始播放%s" % videoname)
    video_time = randint(5, 8)
    sleep(video_time)
    print("%s播放完毕,共%d秒" % (videoname, video_time))


def main():
    start = clock()
    play_video("动作片.avi")
    play_video("龙珠z第271集.mp4")
    end = clock()
    print("共使用%f秒" % (end - start))


if __name__ == '__main__':
    main()

Los resultados operativos

开始播放动作片.avi
动作片.avi播放完毕,共5秒
开始播放龙珠z第271集.mp4
龙珠z第271集.mp4播放完毕,共8秒
共使用13.000016秒

A partir de los resultados anteriores que el código se ejecuta de forma secuencial, es decir, una manera en serie, lo que significa que la primera película de acción para jugar a jugar Dragon Ball Z Juego 271, que es la suma de dos veces, pero entonces, que quería utilizar puntos pantalla, por jugar la acción, y el derecho a jugar perla, esta vez tenemos que utilizar múltiples procesos en dos de la tarea juego en diferentes procesos.

Ejemplos de multi-proceso

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:多进程举例
from multiprocessing import Process
from random import randint
from time import sleep, clock


def play_video(videoname):
    print("开始播放%s" % videoname)
    video_time = randint(5, 8)
    sleep(video_time)
    print("%s播放完毕,共%d秒" % (videoname, video_time))


def main():
    start = clock()
    p1 = Process(target=play_video, args=('动作片.avi',))
    p2 = Process(target=play_video, args=('龙珠z第271集.mp4',))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    end = clock()
    print("共使用%f秒" % (end - start))


if __name__ == '__main__':
    main()

Los resultados operativos

开始播放动作片.avi
开始播放龙珠z第271集.mp4
动作片.avi播放完毕,共6秒
龙珠z第271集.mp4播放完毕,共7秒
共使用7.192672秒

Mirada, mirar a ambos lados, multi-proceso mucho más rápido, puede ahorrar mucho tiempo, hemos creado un objeto de proceso a través de la clase de proceso, se inicia parámetro de destino pasado por un código de parámetro que indica el proceso a realizar, seguido por args es una tupla de parámetros , se inicia el proceso, se unan al proceso por métodos tales como el método de arranque haya terminado de ejecutarse.

Python multiproceso

Por ejemplo single-roscado

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:单线程举例
import time

def saySorry():
	print('sorry')
	time.sleep(1)

if __name__ == "__main__":
	start = time.clock()
	for i in range(5):
		saySorry()
	end = time.clock() - start
	print("运行时间:%f" % end) 

Los resultados operativos

sorry
sorry
sorry
sorry
sorry
运行时间:5.003281

Nada más de una vez por segundo de impresión siento, pasó un total de sólo 5 segundos. A continuación, echar un vistazo a código multiproceso, en esta primera versión de Python en la introducción del módulo de hilo de conseguir, más viejo y le falta algo, por lo que ahora usamos el módulo threading programación multi-hilos, el módulo proporciona una programación más multiproceso buen paquete orientado a objetos. saySorry multiproceso versión sigue

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:多线程举例
import time
import threading

def saySorry():
	print('sorry')
	time.sleep(1)

if __name__ == "__main__":
	start = time.clock()
	for i in range(5):
		t = threading.Thread(target=saySorry)
		# 线程启动,开始执行线程
		t.start()
	end = time.clock() - start
	print("运行时间:%f" % end) 

Los resultados operativos

sorry
sorry
sorry
sorry
sorry
运行时间:0.006523

Obviamente, una reducción significativa en el tiempo de funcionamiento del programa mediante la creación de un módulo de enhebrado del hilo de la clase Thread, se puede crear una clase personalizada hilo heredando de la clase Thread, y luego crear un objeto hilo, se inició un hilo en ella, cuando el método start () cuando se le llama, lo que realmente crear un hilo y se inicia la ejecución
del hilo principal esperará a que todos los niños hasta el final del extremo del hilo

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:多线程举例
from threading import Thread
import time
from time import clock


class SaySorry(Thread):

    def run(self):
        print('sorry')
        time.sleep(1)


def main():
    start = clock()
    s1 = SaySorry()
    s2 = SaySorry()
    s1.start()
    s2.start()
    s1.join()
    s2.join()
    end = clock()
    print("共使用%f秒" % (end - start))


if __name__ == '__main__':
    main()

Multihilo puede compartir el espacio de memoria del proceso, la comunicación multi-roscado se puede lograr a través de una variable global, pero puede obtener resultados inesperados que conducen al fracaso del programa o accidente. Si un recurso es utilizar múltiples hilos compiten, a continuación, que se suele llamar el acceso "recursos críticos" de necesidad "recursos críticos" para añadir protección, de lo contrario los recursos están en un estado de "caos" en. A continuación citar un ejemplo de ahorro de dinero, una descripción crítica es gratuito, sigue sin protección

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:存钱
from threading import Thread
import time


class Account(object):

    def __init__(self):
        self.balance = 0

    def save(self, money):
        # 计算存款后的结果
        money_temp = self.balance + money
        # 模拟存款操作业务耗时0.001秒
        time.sleep(0.001)
        # 修改账户余额
        self.balance = money_temp


class User(Thread):

    def __init__(self, account, money):
        super().__init__()
        self.account = account
        self.money = money

    def run(self):
        self.account.save(self.money)


def main():
    account = Account()
    threads = []
    # 创建200个人每人向账户中存款1元
    for i in range(200):
        user = User(account, 1)
        threads.append(user)
        user.start()
    # 等待所有存款的线程都执行完毕
    for user in threads:
        user.join()
    print("账户余额共有:%d" % account.balance)


if __name__ == '__main__':
    main()

Los resultados de explotación no me demuestran que él podría sentirse más sorprendió al ver que esto también debería no, ja, porque hay muchas discusiones se inician simultáneamente en todo el tiempo de 0 a +1 por la cuenta, así que consiga ese resultados erróneos, entonces ¿cómo podemos evitar este fenómeno? operación de bloqueo entró en vigor, puede estar protegido por una cerradura de nuestra cuenta, cuando un acceso de rosca a la cuenta, la cuenta será bloqueada, y sólo se puede acceder al objeto, mientras que el otro no recibieron el hilo de bloqueo está bloqueado, sólo se espere hasta que el hilo de bloqueo poner una cerradura, otros hilos tienen la oportunidad de competir de bloqueo, de manera que podamos lograr un solo hilo para acceder a la cuenta, para lograr el propósito de la protección, a fin de obtener los resultados deseados.

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:存钱 加锁
from threading import Thread, Lock
import time


class Account(object):

    def __init__(self):
        self.balance = 0
        self._lock = Lock()

    def save(self, money):
        # 先获取锁才能执行后续的代码
        self._lock.acquire()
        try:
            # 计算存款后的结果
            money_temp = self.balance + money
            # 模拟存款操作业务耗时0.001秒
            time.sleep(0.001)
            # 修改账户余额
            self.balance = money_temp
        finally:
            # 在finally中执行释放锁的操作保证正常异常锁都能释放
            self._lock.release()


class User(Thread):

    def __init__(self, account, money):
        super().__init__()
        self.account = account
        self.money = money

    def run(self):
        self.account.save(self.money)


def main():
    account = Account()
    threads = []
    # 创建200个人每人向账户中存款1元
    for i in range(200):
        user = User(account, 1)
        threads.append(user)
        user.start()
    # 等待所有存款的线程都执行完毕
    for user in threads:
        user.join()
    print("账户余额共有:%d" % account.balance)


if __name__ == '__main__':
    main()

En general es tal una

epílogo

La primera vez en el último blog es demasiado largo, la lucha, en la medida de lo posible después de hacer ejercicio todos los días, actualiza a diario. Multi-threaded multi-proceso, Corazón Corazón CORAZÓN! Una gran cantidad de expansión. Buena tormenta ah, el sueño del sueño.
Si encontrar mis artículos en los que hay un error o tiene alguna buenas ideas pueden ponerse en contacto conmigo, estudiamos juntos progresar juntos, mi dirección de correo electrónico está [email protected]

Vamos a hacer más de esos!

Publicado 26 artículos originales · ganado elogios 2 · Vistas 2342

Supongo que te gusta

Origin blog.csdn.net/qq_42909545/article/details/103171489
Recomendado
Clasificación