iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python并发处理
  • 588
分享到

Python并发处理

Python 2023-01-31 02:01:07 588人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

1.创建并销毁线程#!/usr/bin/python #code to execute in an independent thread import time def countdown(n):     while n > 0:

1.创建并销毁线程

#!/usr/bin/python

#code to execute in an independent thread

import time
def countdown(n):
    while n > 0:
       print('T-minus',n)
       n -= 1
       time.sleep(5)

#create and launch a thread

from threading import Thread
t = Thread(target=countdown,args=(10,))
t.start()



Python concurency.py 
('T-minus', 10)
('T-minus', 9)
('T-minus', 8)
('T-minus', 7)
('T-minus', 6)
('T-minus', 5)
('T-minus', 4)
('T-minus', 3)
('T-minus', 2)
('T-minus', 1)



创建一个线程实例后,需要调用start()让其运行。线程是以系统级别线程的方式执行,由操作系统管理。一旦执行,各个线程独立运行,直到目标函数返回结果,可以使用is_alive()查询一个线程实例是否正在运行。

if t.is_alive():
   print('The thread is still running')
else:
   print('Completed')



可以使用join()来请求结合一个线程



执行上述代码时,python解释器会等待所有线程结束。对于需要时间较长的线程或者后台任务,可以考虑将线程以daemon的方式运行


t.setDaemon(True)


不能结合以daemon方式运行的线程,当主线程终止时它们会自动销毁



如果想要能够终止线程,这些线程必须能够可编程在选择的点上能够退出

import time
from threading import Thread

class CountdownTask:
     def __init__(self):
         self._running=True

     def terminate(self):
         self._running=False

     def run(self,n):
         while self._running and n > 0:
             print('T-minus',n)
             n-=1
             time.sleep(5)

c=CountdownTask()
t=Thread(target=c.run,args=(10,))
t.start()

c.terminate()
t.join()


由于Global Interpreter Lock(GIL)全局解释器的原因,Python线程被限制在任何给定时间内只能有一个线程可以执行。基于这个原因,Python线程不能用于那些需要大量计算的任务。Python线程更适合用于I/O处理,处理那些执行阻塞操作例如等待I/O,等待数据库操作结果等的代码的并发执行。




2.判断一个线程是否已经启动

Problem:

已经启动一个线程,但是想要知道它什么时候开始运行的


Solution:

Python线程的一个关键特性就是它们独立执行并且非确定性。如果程序的其他线程需要知道是否一个线程执行进一步操作之前已经达到某一个阶段。threading模块的Event对象可以帮助解决这个问题‘

#!/usr/bin/python

from threading import Thread,Event
import time

#code to execute in an independent thread

def countdown(n,started_evt):
    print('countdown starting')
    started_evt.set()
    while n > 0:
       print('T-minus',n)
       n -= 1
       time.sleep(5)
#create the event object that will be used  to signal startup
started_evt = Event()

#launch the thread and pass the startup event
print('launching countdown')
t=Thread(target=countdown,args=(10,started_evt))
t.start()

#wait for the thread to start
started_evt.wait()
print('countdown is running')



Event objects are best used for one-time events.





#!/usr/bin/python

import threading
import time

class PerodicTimer:
    def __init__(self,interval):
        self._interval=interval
        self._flag=0
        self._cv=threading.Condition()

    def start(self):
        t=threading.Thread(target=self.run)
        t.daemon=True
        t.start()

    def run(self):
        '''
          Run the timer and notify waiting threads after each interval
        '''
        while True:
           time.sleep(self._interval)
           with self._cv:
                self._flag ^= 1
                self._cv.notify_all()


    def wait_for_tick(self):
        '''
          wait for the next tick of the timer
        '''
        with self._cv:
             last_flag=self._flag
             while last_flag == self._flag:
                self._cv.wait()
#example use of the timer
ptimer=PerodicTimer(5)
ptimer.start()

#two threads that synchronize on the timer

def countdown(nticks):
    while nticks > 0:
          ptimer.wait_for_tick()
          print('T-minus',nticks)
          nticks-=1

def countup(last):
    n=0
    while n < last:
       ptimer.wait_for_tick()
       print('Counting',n)
       n+=1

threading.Thread(target=countdown,args=(10,)).start()
threading.Thread(target=countup,args=(5,)).start()
# python event2.py 
('Counting', 0)
('T-minus', 10)
('T-minus', 9)
('Counting', 1)
('Counting', 2)
('T-minus', 8)
('Counting', 3)
('T-minus', 7)
('Counting', 4('T-minus', 6)
)
('T-minus', 5)
('T-minus', 4)
('T-minus', 3)
('T-minus', 2)
('T-minus', 1)







Event对象的一个很重要的特性就是它们会唤醒所有正在等待的线程。如果想要编写一个程序只唤醒单个正在等待的线程,更好使用Semaphore或者Condition对象

#!/usr/bin/python

import threading

#worker thread
def worker(n,sema):
    #wait to be signaled
    sema.acquire()
    #do some work
    print('working',n)
    
#create some threads
sema=threading.Semaphore(0)
nworkers=10
for n in range(nworkers):
    t=threading.Thread(target=worker,args=(n,sema,))
    t.start()


如果运行这个程序,一组线程会被启动,但是没有任何事情发生。应为它们都被阻塞等待获取信号量。每次释放信号量,只有一个worker将被唤醒和运行


直接在python终端执行将无任何反应并且无法终止程序

# python semaphore.py 
^C^C^C^C^C^C^C


在ipython终端中输入以上程序然后执行

In [8]: sema.release()

In [9]: ('working', 0)


In [9]: sema.release()

In [10]: ('working', 1)


In [10]: sema.release()
('working', 2)
 
In [11]: sema.release()
('working'
, 3)
In [12]: sema.release()
('working', 4)

In [13]: sema.release()
('working', 5)

In [14]: sema.release()
('working', 6)
 
In [15]: sema.release()

In [16]: ('working', 7)


In [16]: sema.release()

In [17]: ('working', 8)


In [17]: sema.release()
('working', 
9)
In [18]: sema.release()

In [19]: sema.release()



3.线程间通信

Problem:

执行程序时开启了多个线程,现在需要在这些线程之间通信或者交换数据

Solution:

也许从一个线程发送数据到另一个线程的最安全的方式就是使用 Queue模块.可以创建一个 Queue实例用于所有的线程共享。这些线程然后使用put()或者get()操作来向队列中添加或者删除项目

#!/usr/bin/python
from threading import Thread
from Queue import Queue

#a thread that produces data
def producer(out_q):
   while True:
      #produce some data
      data="producer data"
      out_q.put(data)


#a thread that comsumes data
def consumer(in_q):
   while True:
      #get some data
      data=in_q.get()
      #process the data
      print data
      print "consumer"

#create the shared queue and launch both threads
q=Queue()
t1=Thread(target=consumer,args=(q,))
t2=Thread(target=producer,args=(q,))
t1.start()
t2.start()


执行结果:

producer data
consumer
producer data
consumer
producer data
consumer
producer data
consumer
producer data
consumer
producer data
consumer
producer data
consumer
producer data
consumer
.......
.......


以上代码会不断地循环执行。当使用队列时,协调关闭producer和comsumer会比较诡异。









参考文章:

Http://chimera.labs.oreilly.com/books/1230000000393/ch12.html


--结束END--

本文标题: Python并发处理

本文链接: https://www.lsjlt.com/news/185704.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python并发处理
    1.创建并销毁线程#!/usr/bin/python #code to execute in an independent thread import time def countdown(n):     while n > 0:...
    99+
    2023-01-31
    Python
  • python百万并发数据怎么处理
    在处理百万并发数据时,可以考虑使用以下方法: 使用多线程/多进程:通过创建多个线程或进程来处理并发数据请求,可以提高处理速度。可...
    99+
    2023-10-27
    python
  • Python中的并发处理之使用asyn
    导语:本文章记录了本人在学习Python基础之控制流程篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、了解asyncio包的功能和使用方法;2、了解如何避免阻塞型调用;3、学会使用协程避免回调地...
    99+
    2023-01-31
    Python asyn
  • python使用期物处理并发教程
    目录1. futures.ThreadPoolExecutor2. 期物3. 阻塞型I/O和GIL4. 使用concurrent.futures模块启动进程learning from...
    99+
    2024-04-02
  • java高并发处理 java处理高并发的几种方法
    一、背景综述         并发就是可以使用多个线程或进程,同时处理(就是并发)不同的操作。         高并发的时候就是有很多用户在访问,导致系统数据不正确、糗事数据的现象。对于一些大型网站,比如门户网站,在面对大量用户访问、高并发...
    99+
    2023-09-22
    java
  • PHP开发中如何处理接口并发请求和并发处理
    在实际的Web开发中,我们经常会遇到并发请求的情况。并发请求是指多个请求同时发送给服务器进行处理。如果我们的应用程序无法正确处理并发请求,就有可能导致数据不一致、性能下降等问题。本文将介绍如何在PHP开发中处理接口的并发请求和并发处理,并提...
    99+
    2023-10-21
    接口 并发处理 并发请求
  • Python并行处理
    原文:Parallel Processing in Python 作者:Frank Hofmann 翻译:Diwei 当你在机器上启动某个程序时,它只是在自己的“bubble”里面运行,这个气泡的作用就是用来将同...
    99+
    2023-01-31
    Python
  • python使用期物处理并发的方法
    这篇文章主要介绍“python使用期物处理并发的方法”,在日常操作中,相信很多人在python使用期物处理并发的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python使用期物处理并发的方法”的疑惑有所...
    99+
    2023-07-02
  • 高并发怎么处理
    高并发的处理:尽可能使网站上的页面采方法用静态页面。图片是最消耗资源的,将图片与页面进行分离。缓存、镜像、负载均衡。需要使用数据库集群或者库表散列。...
    99+
    2024-04-02
  • java怎么处理高并发
    在处理高并发时,可以使用以下几种方法来提高Java应用程序的性能和并发处理能力:1. 使用线程池:通过使用线程池可以减少线程的创建和...
    99+
    2023-08-23
    java
  • Java高并发处理方案
    java高并发,如何解决,什么方式解决 一,什么是高并发? 二,高并发解决思路? 三,高并发解决方案 一、什么是高并发 1.1 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,...
    99+
    2023-09-30
    java jvm 开发语言 Powered by 金山文档
  • redis如何处理高并发
    redis 高效处理高并发的关键技术:多线程处理客户端连接和网络 i/o。事件循环机制同时处理多个客户端请求。使用高效数据结构,如哈希表、列表和集合。主从复制分担读操作,降低主服务器压力...
    99+
    2024-04-20
    redis 并发访问 并发请求
  • redis高并发如何处理
    Redis的高并发处理可以通过以下几个方面来进行优化: 集群部署:将Redis分片部署在多台服务器上,通过搭建Redis集群来实...
    99+
    2023-10-28
    redis
  • Python使用future处理并发问题方案详解
    目录网络下载的三种风格按照顺序下载使用conrurrent.futures模块多线程下载使用asyncio异步下载future是什么GIL和阻塞型I/O使用concurrent.fu...
    99+
    2023-02-08
    Python future处理并发 Python future Python future并发问题
  • CPython 与线程处理:Python 并发编程的秘密
    ...
    99+
    2024-04-02
  • Python并发编程:如何优化HTTP请求处理?
    随着互联网的发展,我们的应用程序越来越依赖于HTTP请求。无论是爬取网页、请求API接口还是处理数据,HTTP请求几乎成为了每一个应用程序的必要操作。然而,如果我们在处理HTTP请求时没有考虑并发处理,那么我们的程序可能会因为等待服务器响...
    99+
    2023-09-21
    http 二维码 并发
  • 如何同时处理Python日志和并发操作?
    在编写Python程序时,我们经常需要同时处理日志和并发操作。这两个方面都是非常重要的,因为日志可以帮助我们追踪程序的运行情况,而并发操作可以提高程序的执行效率。在本文中,我们将介绍如何同时处理Python日志和并发操作,并提供一些演示代...
    99+
    2023-09-14
    日志 并发 npm
  • Python使用asyncio包处理并发的实现代码
    使用 asyncio 包处理并发 asyncio包:使用事件循环驱动的协程实现并发。 线程与协程的对比 '\ thinking' 旋转等待效果 In [1]: imp...
    99+
    2022-12-08
    Python asyncio包 Python asyncio包处理并发
  • PHP开发中如何处理异步请求和并发处理
    在Web开发中,经常会遇到需要处理大量并发请求和异步请求的情况。以PHP为例,我们可以利用一些技术和工具来处理这些需求,提高系统的性能和响应能力。本文将介绍如何处理异步请求和并发处理,并提供一些具体的代码示例。一、异步请求的处理使用Ajax...
    99+
    2023-10-21
    异步请求 PHP开发 并发处理
  • ADO.NET如何处理并发更新
    这篇文章主要介绍了ADO.NET如何处理并发更新,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。设置并发模式Entity Framework 实现了乐观的并发模式(Optimi...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作