python的多线程与异步编程

      操作系统中,进程是资源分配的基本单位,线程是PU调度(程序执行)的最小单位。计算机执行程序必须分配资源(内存,有堆、栈、自右存储区、全局/静态变量区、数据区)

1.多线程

关于多线程的介绍,这不再阐述,请见python内置函数thread

相关操作:

# encoding:utf-8
# 多线程测试
import time
import threading

def test_thread(para='hi',sleep=3):
    time.sleep(sleep)
    j = 1
    for i in range(10000):
        j += 1
    print(j)

def main():
    # 创建线程
    print('启动线程.....')
    thread_hi = threading.Thread(target=test_thread)
    thread_hello = threading.Thread(target=test_thread,args=('hello',1))
    # 启动线程
    thread_hi.start()
    thread_hello.start()
    print('Main thread has ended!')

if __name__ == '__main__':
    t1 = time.time()
    
    main()
    print(time.time() - t1)

    print('不使用线程...')

    t2 = time.time()
    test_thread()
    print(time.time() - t2)

具体案例:

现有新浪新闻分类数据,数据文件格式如下:

                                          

cnews下存在14个类型的新闻数据,每个类别下有一系列的新闻文本内容。现需将所有的新闻数据按照 类型+tab+文本内容存放在txt文件中。据统计,cnews下每个类型的新闻有如下图的文件数目。

{'体育': 131604, '娱乐': 92632, '家居': 32586, '彩票': 7588, '房产': 20050, '教育': 41936,
 '时尚': 13368,'时政': 63086, '星座': 3578, '游戏': 24373, '社会': 50849, '科技': 162929, 
'股票': 154398, '财经': 37098}

多线程处理这些文件,并保存为train,dev,test三文件形式,其代码如下:

# encoding:utf-8
import os
import random
import time
import threading

def getpath(path='cnews'):
    return os.path.abspath(os.path.dirname('__file__')) + os.path.sep + path

def labelFileOrg(num=2000):
    cnews_label = ['cnews\\' + ch for ch in os.listdir(getpath('cnews')) if '\u4e00' <= ch <= '\u9fff'] # 判断ch是否为中文
    cnew_label_file = dict()
    for ch in cnews_label:
        print('新闻类型:',ch)
        file_list = os.listdir(getpath(ch))
        random.shuffle(file_list)
        cnew_label_file[ch] = file_list[:num]
        for file_name in file_list[:int(num * 0.7)]:
            writeFile(ch,getpath(ch + '\\' + file_name))
        
        for file_name in file_list[int(num * 0.7 + 1):int(num * 0.9)]:
            writeFile(ch,getpath(ch + '\\' + file_name),'cnews\\cnews.dev.txt')
        
        for file_name in file_list[int(num * 0.9 + 1):num]:
            writeFile(ch,getpath(ch + '\\' + file_name),'cnews\\cnews.test.txt')   


def writeFile(ch,filename,path='cnews\\cnews.train.txt'):

    with open(filename,'rb') as fp:
        text = ' '.join([line.decode().strip('\n') for line in fp.readlines()])
        text = ch[6:] + ' ' + text

    with open(path,'a',encoding = 'utf-8') as fp:
        fp.writelines(text + '\n')

def main():
    # 创建线程
    print('启动线程.....')
    thread_hi = threading.Thread(target=labelFileOrg)
    thread_hello = threading.Thread(target=labelFileOrg,args=('hello',1))
    # 启动线程
    thread_hi.start()
    thread_hello.start()
    print('Main thread has ended!')

if __name__ == '__main__':
    t1 = time.time()
    main()
    print(time.time() - t1)

2. 异步编程

python中最常见的异步编程操作,是用asyncio模块。详细使用介绍见Python 异步编程入门

使用方法

# encoding = utf-8
import asyncio

async def count():
    print("One")
    await asyncio.sleep(1)
    print("Two")

async def main():
    await asyncio.gather(count(), count(), count())

asyncio.run(main())

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 库是否可行? 可以回答这个问题。Python 多线程调用异步库是可行的,但需要注意线程安全问题。异步库本身是为了解决 I/O 密集型任务而设计的,多线程可以提高 CPU 密集型任务的效率,但需要注意避免多线程之间的资源竞争和死锁等问题。建议使用 Python 的协程库 asyncio 来实现异步编程,同时使用 threading 或 multiprocessing 来实现多线程或多进程。 ### 回答2: Python中可以通过多线程调用异步操作来提高程序的并发能力和响应速度。 在Python中,可以使用`threading`模块来创建和管理多线程多线程是一种并发执行的方式,它允许多个线程在同一时间内执行不同的任务。 同时,Python也支持异步编程,可以通过`asyncio`模块来进行异步操作。异步操作可以在等待某些IO操作完成时,让出CPU资源给其他任务,以提高效率。 我们可以将异步操作放在一个线程中进行执行。具体步骤如下: 1. 使用`threading`模块创建一个线程对象,并指定一个函数为线程的执行体。 2. 在该函数中,使用`asyncio`模块的相关方法来定义和执行异步操作,比如使用`async`关键字定义异步函数,使用`await`关键字阻塞等待异步操作的完成。 3. 启动线程,开始执行异步操作。 这样,我们就可以在一个线程中同时执行多个异步操作,提高程序的并发能力。 需要注意的是,由于Python的全局解释锁(GIL)的存在,使得多线程无法真正实现并行执行。因此,通过多线程调用异步来提高程序的性能,主要是通过异步操作的非阻塞特性来实现任务的并发执行,而不是真正的并行执行。 总结起来,Python通过多线程调用异步可以提高程序的并发能力和响应速度,但需要注意多线程无法真正实现并行执行的限制。 ### 回答3: Python中的多线程调用异步可以通过一些库和技巧来实现。 首先,要注意Python的全局解释器锁(GIL),它会限制同一时间只能有一个线程在解释器中执行Python字节码。因此,Python多线程并不能真正实现并行计算,但可以用于处理I/O密集型任务。 要在Python中实现多线程调用异步,可以使用以下的方式之一: 1. asyncio库:asyncioPython异步I/O框架,它使用协程来实现异步编程。可以使用asyncio库在多个线程中调用异步函数。需要注意的是,在使用asyncio时,应该确保所有的I/O操作都是非阻塞的,否则会阻塞主线程。 2. 多进程 + 异步库:Python中也可以通过多进程来实现并行的异步编程。可以使用multiprocessing库来创建多个进程,然后在每个进程中使用异步库来处理异步任务。 3. 线程池 + 异步库:Python中的concurrent.futures库提供了线程池和进程池的实现,可以通过线程池来实现多线程调用异步。可以使用ThreadPoolExecutor类来创建线程池,并将异步任务提交给线程池处理。 无论采用哪种方式,多线程调用异步都需要注意线程安全和资源共享的问题。需要使用锁和同步机制来保证线程安全,并避免竞态条件和死锁的发生。 综上所述,Python多线程调用异步可以使用asyncio库、多进程和异步库、线程池和异步库等方式实现。具体选择哪种方式取决于实际需求和场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值