首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

线程函数不能召回自身( python 2.7 )

线程函数不能召回自身是指在Python 2.7中,线程函数无法直接调用自身来实现递归调用。这是因为Python 2.7中的线程模块(thread)使用了不同的线程实现方式,导致无法在线程函数内部直接调用自身。

然而,可以通过其他方式来实现线程函数的递归调用。一种常见的方法是使用线程池(ThreadPoolExecutor)来管理线程,并在线程函数内部通过提交新的任务来实现递归调用。具体步骤如下:

  1. 导入线程池相关模块:
代码语言:txt
复制
from concurrent.futures import ThreadPoolExecutor
  1. 创建线程池对象:
代码语言:txt
复制
executor = ThreadPoolExecutor(max_workers=1)
  1. 定义线程函数:
代码语言:txt
复制
def my_thread_function():
    # 线程函数的逻辑处理
    # ...

    # 提交新的任务到线程池
    executor.submit(my_thread_function)
  1. 在主线程中调用线程函数:
代码语言:txt
复制
executor.submit(my_thread_function)

这样,线程函数就可以通过提交新的任务到线程池来实现递归调用。

线程函数不能召回自身的限制是由于Python 2.7的线程模块的实现方式所致。在Python 3及更高版本中,可以使用更先进的线程模块(threading)来实现线程函数的递归调用,而无需使用线程池。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python的open函数文件读写线程

工作中遇到的问题:如何在多线程的程序中同时记录日志?...最初图省事,使用了最原始的open函数来写日志,因为开始使用的写文件模式的是追加('a'),发现并没有线程不安全的现象,各个线程的的日志信息都写入到了日志文件中。...后来将写文件模式改成了只写默认('w'),这时候线程不安全的问题就显露出来了,只有一个线程的日志信息被记录。...这时候觉得不能再图省事了,有必要把Python标准库中专用日志模块logging好好学习一下,果然不让人失望,logging是线程安全的。...,追加模式('a')貌似并没有线程不安全的现象 多线程记录日志信息,还是使用标准库的logging模块吧,它线程安全!

99120
  • 可变数据类型不能作为python函数的参数

    可变数据类型:列表、字典 不可变数据类型:整型、浮点型、字符串、元组 为什么可变数据类型不能作为python函数的参数?...: a.append(1) return a print(foo()) print(foo()) print(foo()) 结果: [1] [1, 1] [1, 1, 1] 我们继续打印下每次函数的返回值的内存地址...print(b) print(test()) print(b) 结果: [1, 2] [1, 2, 1] [1, 2, 1] [1, 2, 1, 1] [1, 2, 1, 1] 当使用列表作为参数传入函数时...print(id(d)) print(id(c)) 结果: [1, 2, 3, 4] [1, 2, 3, 4] 140344851860104 140344851860104 所以在上述中,通过在test()函数中修改...python中一切皆对象。函数也是对象,可以这么理解,一个函数是一个被它自己定义而执行的对,;默认参数是一种"成员数据",所以它们的状态和其他对象一样,会随着每一次调用而改变。 怎么避免这种现象呢?

    1.6K10

    Python线程编程基础3:创建线程与调用函数的区别

    在上一节Python线程编程基础2:如何创建线程中,我们已经知道,创建线程并运行实际上也是执行一段代码,那么把这些代码封装到函数中之后,直接调用函数和创建线程再运行有什么区别呢?...简单地说,调用函数属于阻塞模式,必须要等函数运行结束并返回之后才能执行后面的代码;而线程属于并发非阻塞模式,创建并启动子线程之后子线程和主线程并发执行,除非有现成同步的代码和机制。...下面代码首先定义一个函数,然后调用这个函数函数执行结束之后再继续执行后面的代码: from threading import Thread from time import sleep def demo...(n): sleep(n) print(n) demo(3) print('ok') 运行结果为: 3 ok 而下面的代码首先定义函数,然后创建线程来执行这个函数中的代码: from threading

    1.2K80

    Python线程并行执行两个函数,并获取线程返回结果

    参考链接: 在Python中返回多个值 本人使用场景是,获取用户数据,然后插入到库中,并返回查询该用户的相关结果,实际上包含两个操作:  1.插入  无返回值 2.查询,有返回值。...实现demo如下,使用Python3实现:  # -*- coding: utf-8 -*- """ @author: JiaWei Tian """ # thread_test  2019/3/6 8...def two(i):     a = i+3     print('two', a)     return a def get_result(a):     threads = []  # 定义一个线程池...__name__)     t1 = threading.Thread(target=one)  # 建立一个线程并且赋给t1,这个线程指定调用方法one,并且不带参数     threads.append...(t)  # 把t1线程装到threads线程池里     # t2 = threading.Thread(target=two, args=(a,))     threads.append(t1)

    2.6K20

    python函数在一定条件下需要调用自身时的写法说明

    此时箭头所指的地方,所输入的0传给了其他条件下,第二次运行函数时的状态下,第一个状态仍为1,并未改变,因此在退出了第二次运行的函数后,仍然会继续运行第一个函数中state = 1的循环,导致还得再次输入...break为跳出本层循环,只影响一层 continue为跳出本次循环,进行下一次循环 return为为直接跳出当前函数 补充知识:在python中调用自己写的方法或函数function 一、在command...中调用 1 在终端里先用 cd 指令到指定路径(D盘) 2 切到 python 交互环境下,输入 import myfunc (如果 myfunc.py 是你的文件全名的话) import myfunc...sys.path.append('C:\Users\username\PycharmProjects\untitled\study_some') import list #调用 list.print_l(movies) 以上这篇python...写函数在一定条件下需要调用自身时的写法说明就是小编分享给大家的全部内容了,希望能给大家一个参考。

    1.1K20

    Python 多进程开发与多线程开发

    现在的处理器有个趋势就是朝着多核方向发展,在没有线程之前,多核并不能让一个进程的执行速度提高,原因还是上面所有的两点限制。...但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。.../usr/local/python27/bin/python2.7 # coding=utf8 # noinspection PyUnresolvedReferences # 通过多进程和多线程对比,进程间内存无法共享...启动一个线程就是把一个函数传给Thread实例,然后调用start()方法。  先来看一个示例程序: #!...不过,也不用过于担心,Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。

    57300

    Python线程两种实现方式

    目前python 提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,而threading模块是对thread做了一些包装,...2.7版本之前python线程的支持还不够完善,不能利用多核CPU,但是2.7版本的python中已经考虑改进这点,出现了multithreading 模块。...threading模块里面主要是对一些线程的操作对象化,创建Thread的class。...一般来说,使用线程有两种模式: A 创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行; B 继承Thread类,创建一个新的class,将要执行的代码 写到run函数里面。...第一种 创建函数并且传入Thread 对象中 t.py 脚本内容 import threading,time from time import sleep, ctime def now() :

    38920

    Python】多线程编程 ② ( 进程与线程 | 进程的内存空间 | 并行执行概念 | 线程的创建和执行 | threading.Thread() 函数解析 )

    的一小部分 ; 一个 进程 中 可以有若干 线程 , 这些 线程 共享 进程的 内存空间 ; 进程 只能 访问 操作系统 分配给自己的 内存空间 , 不能访问其它 进程 的 内存空间 ; 下图中 ,...进程 A 只能访问自己的内存 , 不能访问 进程 B 的内存 ; 2、线程之间的共享内存 一个 进程 中的 若干 线程 , 可以共享 进程 的 内存空间 ; 线程 只能 访问 本进程 的内存空间 ,...不能访问 其它 进程的 内存空间 ; 3、并行执行概念 进程 之间 可以 并行执行 , 操作系统 中的 多个 进程 , 可以在 同一时间 做 不同的 工作 ; 线程 之间 可以 并行执行 , 进程 中的...多个线程 , 可以在 同一时间 做 不同的 工作 ; 二、Python线程编程 ---- 1、线程的创建和执行 所有的编程语言 都允许 多线程编程 , Python 也支持 多线程编程 ; Python...\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Hello.py Hello Tom, 18 years old

    25920

    Python 装饰器控制函数 Timeout 的正确姿势

    如果你恰好看过我之前的这篇《深入浅出 Python 装饰器:16 步轻松搞定 Python 装饰器》,那应该很自然的想到,Python 装饰器最适合这种业务场景了:对函数进行额外功能性包装,又不侵入主体业务逻辑..., chunksize).get()   File "/opt/soft/python-2.7.10/lib/python2.7/multiprocessing/pool.py", line 567, ...,不能用在多线程环境下的子线程中,而且 signal 只能用在 *nix 环境下,不能跨平台,看到这里,似乎这个问题又不那么容易解决了,看来咱们得另辟蹊径。...因为其本质是使用将函数使用重载的线程来控制,一旦被添加装饰器的函数内部使用了线程或者子进程等复杂的结构,而这些线程和子进程其实是无法获得超时控制的,所以可能导致外层的超时控制无效。...5、函数超时在多线程场景下 2 个常见误区 sleep、wait、join 不能直接用来实现或替代超时功能 尤其是 join(timeout) 方法里的 timeout 很容易让初学者误解,以为调用了

    8.1K100

    使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号

    我的Python环境是Python 2.7 64bit。这是比较适合新手使用的开发环境。...至于现在python都已经出了3.x版本了,为什么我这里还使用的是python2.7?我个人选择2.7版本的原因是自己当初很早以前买的python核心编程这本书是第二版的,仍然以2.7为示例版本。...我们并不能准确知道执行完一个任务要多久时间,肯定不能用这个办法。所以我们这个时候应该上网查询一下有什么办法能够让子线程“卡住”主线程呢?...python中的hashlib模块就为我们封装好了这些数学运算函数,我们只需要简单的调用它就可以完成哈希运算。 为什么在我这个爬虫中用到了这个包呢?...这里我们要注意一个细节问题:mysqldb模块并不是线程安全版本,意味着我们不能在多线程中共享同一个mysql连接句柄。

    1.2K21

    微信搜一搜在线检索技术演进复盘

    上升阶段 线程系数由 1.5 递增到 3.5 时,整体上升,上升趋势逐步收敛。 分析:大多数请求召回篇数较低,甚至空召回,增加各线程池的线程数量,本质上是增加了各任务阶段并发度。...在引入时间片调度后,会增加以下成本: 1 增加了各任务的入队出队次数 2 由于业务相关性的一些需要,相关性库在每个任务的开始函数和结束函数的调用会变为多次(任务粒度的调度则只有一次) 如果将上述第 2...另一方面,理论上求交膨胀系数越大,求交篇数配置越小,最终召回结果将会越优质,原因在于其裁剪规模将越大(未满求交的前提下)。使用者可以根据自身需求,综合考虑召回篇数,召回效果以及性能损耗。...关于性能优化 性能优化是一个非必须,但是又避不开的话题,一方面引擎性能不能太拉垮,但是比性能更值得去建设的事情又太多了,其重要性也就大打折扣了,另一方面,性能优化是一个长期持续的事情,从我们开始这部分工作以来...搜索引擎进行召回时,需要召回多篇文档,因此本身就处在一个大的循环的场景中,存在部分代码段调用时机极为频繁,即自身存在优化基础,另一方面,在短平快开发模式下,无法写出具备较优性能的代码,也因此引擎在代码性能方面存在优化空间

    1.3K30

    Python线程为什么搞个setDaemon

    反藤摸瓜 Python 解析器在结束的时候,会调用 wait_for_thread_shutdown 来做个例行清理: // python2.7/python/pythonrun.c static void...,这个函数是运行了不同的逻辑的 很明显,我们上面的脚本,就是命中了这个线程逻辑,所以它会动态 import threading 模块,然后执行 _shutdown 函数。...这个函数的内容,我们可以从 threading 模块看到: # /usr/lib/python2.7/threading.py _shutdown = _MainThread()....不着急,容我娓娓道来: 从起源谈存活条件 在 Python线程模型里面,虽然有 GIL 的干涉,但是线程却是实实在在的原生线程 Python 只是多加一层封装: t_bootstrap,然后再在这层封装里面执行真正的处理函数...在 threading 模块内,我们也能看到一个相似的: # /usr/lib/python2.7/threading.py class Thread(_Verbose): def start

    64810

    微信搜一搜在线检索技术演进复盘

    上升阶段 线程系数由 1.5 递增到 3.5 时,整体上升,上升趋势逐步收敛。 分析:大多数请求召回篇数较低,甚至空召回,增加各线程池的线程数量,本质上是增加了各任务阶段并发度。...在引入时间片调度后,会增加以下成本: 1 增加了各任务的入队出队次数 2 由于业务相关性的一些需要,相关性库在每个任务的开始函数和结束函数的调用会变为多次(任务粒度的调度则只有一次) 如果将上述第 2...另一方面,理论上求交膨胀系数越大,求交篇数配置越小,最终召回结果将会越优质,原因在于其裁剪规模将越大(未满求交的前提下)。使用者可以根据自身需求,综合考虑召回篇数,召回效果以及性能损耗。...关于性能优化 性能优化是一个非必须,但是又避不开的话题,一方面引擎性能不能太拉垮,但是比性能更值得去建设的事情又太多了,其重要性也就大打折扣了,另一方面,性能优化是一个长期持续的事情,从我们开始这部分工作以来...搜索引擎进行召回时,需要召回多篇文档,因此本身就处在一个大的循环的场景中,存在部分代码段调用时机极为频繁,即自身存在优化基础,另一方面,在短平快开发模式下,无法写出具备较优性能的代码,也因此引擎在代码性能方面存在优化空间

    1.3K20
    领券