线程GIL锁 线程队列 回调函数

----------------------------------无法改变风向,可以调整风帆;无法左右天气,可以调整心情。如果事情无法改变,那就去改变观念。

# # ------------------------------------------------------------------------------------------------------------#
# # --------------[线程队列]--------------

# import queue

#先进先出队列# q = queue.Queue(3) #创建了一个长度为3的队列,也就是说,最多只能放3个数据## q.put(2)# print(‘>>>>‘,q.qsize())# q.put(5)# print(‘>>>>‘,q.qsize())# q.put(0)## # q.put(1)# try:#     q.put_nowait(1)# except Exception:#     print(‘队列满了‘)# print(q.get())# print(q.get())# print(q.get())# # print(q.get())# # print(q.get_nowait())

#后进先出,先进后出

# import queue## q = queue.LifoQueue(3)## q.put(1)# q.put(2)# q.put(3)## print(q.get())# print(q.get())# print(q.get())

# 优先级队列

import queue

q = queue.PriorityQueue(5)

q.put((3,33))

q.put((1,2))q.put((1,3))# q.put((1,(3,2)))# q.put((1,(1,2)))

q.put((2,22))q.put((4,44))

print(q.get())print(q.get())print(q.get())print(q.get())print(q.get())

# # --------------[创建线程池]--------------

import timefrom concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutorfrom multiprocessing import Pool

def func(n):    # print(n)    time.sleep(1)    return n * n

if __name__ == ‘__main__‘:    # t_p = ThreadPoolExecutor(max_workers=4)    t_p = ProcessPoolExecutor(max_workers=4)    # p_pool = Pool(4)    res_list = []

for i in range(10):        res = t_p.submit(func,i)  #异步提交任务        # print(res.result())  #等待任务的执行结果,拿不到就阻塞,拿到了再运行        res_list.append(res)

t_p.shutdown()

print(‘主线程结束‘)

for res1 in res_list:        print(res1.result())

# for i in range(10):    #     res = p_pool.apply_async(func,args=(i,))    #     # print(res)    #     print(res.get())

# # --------------[进程池的map方法]--------------

import timefrom concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutorfrom multiprocessing import Pool

def func(n):    # print(n)    time.sleep(1)    return n * n

if __name__ == ‘__main__‘:    t_p = ThreadPoolExecutor(max_workers=4)    # t_p = ProcessPoolExecutor(max_workers=4)    # p_pool = Pool(4)    # res_list = []

res = t_p.map(func,range(10))  #    # print(res)    t_p.shutdown()

print(‘主线程结束‘)    for i in res:        print(i)

# print([t1 for t1 in res])    # for i in range(10):    #     res = t_p.submit(func,i)  #异步提交任务    #     # print(res.result())  #等待任务的执行结果,拿不到就阻塞,拿到了再运行    #     res_list.append(res)    #    # t_p.shutdown()    #    # print(‘主线程结束‘)    #    # for res1 in res_list:    #     print(res1.result())

# for i in range(10):    #     res = p_pool.apply_async(func,args=(i,))    #     # print(res)    #     print(res.get())

# # --------------[回调函数]--------------

import timefrom concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutorfrom multiprocessing import Pool

def func(n):    time.sleep(1)    return n * n

def call_back(m):    print(‘>>>>>‘,m)    print(m.result())

if __name__ == ‘__main__‘:    # t_p = ThreadPoolExecutor(max_workers=4)    t_p = ProcessPoolExecutor(max_workers=4)    p_pool = Pool(4)    res_list = []

res = t_p.submit(func,10).add_done_callback(call_back)

# p_pool.apply_async(func,args=(10,),callback=call_back)    # for i in range(10):    #     res = p_pool.apply_async(func,args=(i,))    #     # print(res)    #     print(res.get())

原文地址:https://www.cnblogs.com/dealdwong2018/p/10058978.html

时间: 2024-10-04 03:55:31

线程GIL锁 线程队列 回调函数的相关文章

数百条线程为何频繁断开,回调函数为何迟迟没有结果

数百条线程为何频繁断开,回调函数为何迟迟没有结果,my SQL的数据为何屡遭黑手,连环嵌套循环案,究竟是何人所为??诡异的bug背后究竟是人是鬼,传来的对象次次为空的事件又隐藏着什么?这一切的背后,是类型转换的错误,还是空指针异常?敬请关注今晚9点程序员IT年度巨献<加班的不归路>,让我们跟随着镜头走进程序员变态狂的内心世界…即将上映的年终大片:<加班33天><那些年,我们一起做的项目><宕机惊魂7><通宵之城4><程序员的救赎>&l

GIL锁,线程池,同步异步

1.GIL 是一个全局解释器锁 ,是一种互斥锁 为什么需要GIL:因为一个python.exe进程中只有一分解释器,如果这个进程开启了多个线程都要执行代码 多线程之间要竞争解释器,一旦竞争就有可能出现问题 带来的问题:同一时间只有一个线程可以访问解释器 好处:保证了多线程的数据完全 thread-safe 线程安全的 多个线程同时访问也不会出问题 not thread-safe 非线程安全的 多个线程同时访问可能会出问题 (加锁) 默认情况下一个进程只有一个线程 是不会出现问题的 ,但是不要忘记

第36篇 多进程的数据共享,进程池的回调函数,线程 什么是GIL锁,Threading模块记

内容概览: 进程 数据共享 进程池--回调函数 线程 线程的基础理论 什么是线程? 线程与进程的关系 GIL锁 线程的开启: Threading模块1,用多进程开启socket创建聊天 server端写了input函数会报错?因为服务器是高速运行的,自动化的为来访问的客户端提供服务, 不可能停下来等待管理员的输入,然后发送给客户.这就失去了自动化的意义. 2,进程池Pool()方法创建的进程,map()方法是否有返回值? p.map()得到的是迭代对象 import time from mult

GIL线程全局锁 协程

GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务,python的多线程起到作用,但对于cpu密集型任务,python的多线程几乎占不到任何优势,还有可能因为争夺资源而变慢. 见Python 最难的问题 解决办法就是多进程和下面的协程(协程也只是单CPU,但是能减小切换代价提升性能). 19 协程 知乎被问到了,呵呵哒,跪了 简单点说协程是进程和线

python并发编程之线程(创建线程,锁(死锁现象,递归锁),GIL锁)

什么是线程 进程:资源分配单位 线程:cpu执行单位(实体),每一个py文件中就是一个进程,一个进程中至少有一个线程 线程的两种创建方式: 一 from multiprocessing import Process def f1(n): print(n,'号线程') if __name__ == '__main__': t1 = Thread(target=f1,args=(1,)) t1.start() print('主线程')  二 from threading import Thread

Delphi回调函数及其使用

Delphi回调函数及其使用 1 回调函数的概述 回调函数是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括OOP中的对象.全局函数等)时,将一些参数传递给对象,同时将一个调用者可以访问的函数地址传递给该对象.这个函数就是调用者和被调用者之间的一种通知约定,当约定的事件发生时,被调用者(一般会包含一个工作线程)就会按照回调函数地址调用该函数.  这种方式,调用者在一个线程,被调用者在另一个线程. 消息: 消息也可以看作是某种形式的回调,因为消息也是在初始化时由调用者向被调用者传递一个

回调函数及其使用 Delphi

1 回调函数的概述   回调函数是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括OOP中的对象.全局函数等)时,将一些参数传递给对象,同时将一个调用者可以访问的函数地址传递给该对象.这个函数就是调用者和被调用者之间的一种通知约定,当约定的事件发生时,被调用者(一般会包含一个工作线程)就会按照回调函数地址调用该函数.   这种方式,调用者在一个线程,被调用者在另一个线程.   消息: 消息也可以看作是某种形式的回调,因为消息也是在初始化时由调用者向被调用者传递一个句柄和一个消息编号,

Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet

主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import Thread import threading import time def work(): time.sleep(1) print("子线程对象>>>", threading.current_thread()) # 子线程对象 print("子线程名称>

进程间的数据共享、进程池的回调函数和线程初识、守护线程

一.进程的数据共享 进程间数据是独立的,可以借助于队列或管道实现通信,二者都是基于消息传递的 虽然进程间数据独立,但可以通过Manager实现数据共享. 把所有实现了数据共享的比较便捷的类都重新又封装了一遍,并且在原有的multiprocessing基础上增加了新的机制 list dict等 数据共享的机制 支持数据类型非常有限 list dict都不是数据安全的,你需要自己加锁来保证数据安全 Manager用法: Manager().dict() # 创建共享的字典 Manager().lis