登陆

章鱼彩票最新公告-Python学习之进程和线程

admin 2020-02-14 171人围观 ,发现0个评论

Python学习之进程和线程

Python学习目录

  1. 在Mac下运用Python3
  2. Python学习之数据类型
  3. Python学习之函数
  4. Python学习之高档特性
  5. Python学习之函数式编程
  6. Python学习之模块
  7. Python学习之面向目标编程
  8. Python学习之面向目标高档编程
  9. Python学习之过错调试和测验
  10. Python学习之IO编程
  11. Python学习之进程和线程
  12. Python学习之正则
  13. Python学习之常用模块
  14. Python学习之网络编程

关于操作体系来说,一个使命便是一个进程(Process),比方翻开一个浏览器便是发动一个浏览器进程,翻开一个记事本就发动了一个记事本进程,翻开两个记事本就发动了两个记事本进程,翻开一个Word就发动了一个Word进程。

有些进程还不止一起干一件事,比方Word,它能够一起进行打字、拼写查看、打印等工作。在一个进程内部,要一起干多件事,就需要一起运转多个“鱼人二代子使命”,咱们把进程内的这些“子使命”称为线程(Thread)。

进程

Python的os模块封装了常见的体系调用,其间包含fork,能够在Python程序中轻松创立子进程:

import os
print('Process (%s) start...' % os.getpid())
# Only works on Unix/Linux/Mac:
pid = os.fork()
if pid == 0:
print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
else:
print('I (%s) just created a child process (%s).' % (os.getpid(), pid))
仿制代码

运转成果如下:

Process (876) start...
I (876) just created a child process (877).
I am child process (877) and my parent is 876.
仿制代码

因为Windows没有fork调用,上面的代码在Windows上无法运转。因为Mac体系是根据BSD(Unix的一种)内核,所以,在Mac下运转是没有问题的,引荐大家用Mac学Python!

multiprocessing

假如你计划编写多进程的服务程序,Unix/Linux无疑是正确的挑选。因为Windows没有fork调用,莫非在Windows上无法用Python编写多进程的程序?

因为Python是跨渠道的,天然也应该供给一个跨渠道的多进程支撑。multiprocessing模块便是跨渠道版别的多进程模块。

multiprocessing模块供给了一个Process类来代表一个进程目标,下面的比如演示了发动一个子进程并等候其完毕:

from multiprocessing import Process
import os
# 子进程要履行的代码
def run_proc(name):
print('Run child process %s (%s)...' % (name, os.getpid()))
if __name__=='__main章鱼彩票最新公告-Python学习之进程和线程__':
print('Parent process %s.' % os.getpid())
p = Process(target=run_proc, args=('test',))
print('Child process will start.')
p.start()
p.join()
print('Child process end.')
仿制代码

履行成果如下:

Parent process 928.
Process will start.
Run child process test (929)...
Process end.
仿制代码

创立子进程时,只需要传入一个履行函数和函数的参数,创立一个Process实例,用start()办法发动,这样创立进程比fork()还要简略。

join()办法能够等候子进程完毕后再持续往下运转,一般用于进程间的同步。

线程

Python的规范库供给了两个模块:_thread和threading,_thread是初级模块,threading是高档模块,对_thread进行了封装。绝大多数情况下,咱们只需要运用threading这个高档模块。

发动一个线程便是把一个函数传入并创立Thread实例,然后调用start()开端履行:

import time, threading
# 新线程履行的代码:
def loop():
print('thread %s is running...' % threading.current_thread().name)
n = 0
while n < 5:
n = n + 1
print('thread %s >>> %s' % (threading.current_thread().name, n))
time.sleep(1)
print('thread %s ended.' % threading.current_thread().name)
print('thread %s is running...' % threading.current_thread().name)
t = threading.Thread(target=l章鱼彩票最新公告-Python学习之进程和线程oop, name='LoopThread')
t.start()
t.join()
print('thread %s ended.' % threading.current_thread().name)
仿制代码

履行成果如下:

thread MainThread is running...
thread LoopThread is running...
thread LoopThread >>> 1
thread LoopThread >>> 2
thread LoopThread >>> 3
thread LoopThread >>> 4
thread LoopThread >>> 5
thread LoopThread ended.
thread MainThread ended.
仿制代码

Lock

多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份仿制存在于每个进程中,互不影响,而多线程中,一切变量都由一切线程同享,所以,任何一个变量都能够被任何一个线程修正,因而,线程之间同享数据最大的风险在于多个线程一起改一个变量,把内容给改乱了。

balance = 0
lock = threading.Lock()
def run_thread(n):
for i in r章鱼彩票最新公告-Python学习之进程和线程ange(100000):
# 先要获取锁:
lock.acquire()
try:
# 放心肠改吧:
change_it(n)
finally:
# 改完了必定要开释锁:
lock.release()
仿制代码

当多个线程一起履行lock.acquire()时,只要一个线程能成功地获取锁,然后持续履行代码,其他线程就持续等候直到取得锁停止。

取得锁的线程用完后必定要开释锁,不然那些苦苦等候锁的线程将永久等候下去,成为死线程。所以咱们用try...finally来保证锁必定会被开释。

ThreadLocal

import threading
# 创立大局ThreadLocal目标:
local_school = threading.local()
def process_student():
# 获取当时线程相关的student:
std = local_school.student
print('Hello, %s (in %s)' % (std, threading.current_thread().name))
def process_thread(name):
# 绑定ThreadLocal的student:
local_school.student = name
process_student()
t1 = threading.Thread(target= process_thread, args=('Alice',), name='Thread-A')
t2 = threading.Thread(target= process_thread, args=('Bob',), name='Thread-B')
t1.start()
t2.start()
t1.join()
t2.join()
仿制代码

履行成果:

Hello, Alice (in Thread-A)
Hello, Bob (in Thread-B)
仿制代码

大局变量local_school便是一个ThreadLocal目标,每个Thread对它都能够读写student特点,但互不影响。你能够把local_school当作大局变量,但每个特点如local_school.student都是线程的局部变量,能够恣意读写而互不搅扰,也不必办理锁的问题,ThreadLocal内部会处理。

能够理解为大局变量local_school是一个dict,不光能够用local_school.student,还能够绑定其他变量,如local_school.teacher等等。

ThreadLocal最常用的当地便是为每个线程绑定一个数据库衔接,HTTP恳求,用户身份信息等,这样一个线程的一切调用到的处理函数都能够十分方便地拜访这些资源。

下一篇:Python学习之正则参考文献:K码农-http://kmanong.top/kmn/qxw/form/home?top_cate=28

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP