鱼C论坛

 找回密码
 立即注册
查看: 4917|回复: 6

[已解决]多线程问题

[复制链接]
发表于 2023-9-9 22:32:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
多线程同时运行时,在遇到特定函数时,怎么只执行一次。
比如遇到验证码时。
最佳答案
2023-9-12 20:53:27
如果在一段时间后又遇到验证码,可以将上述的全局变量 `function_executed` 重新设置为 `False`,以便下次特定函数执行时可以再次执行。


  1. import threading
  2. import time

  3. # 全局变量,用于标记特定函数是否已经执行
  4. function_executed = False

  5. # 特定函数
  6. def special_function():
  7.     global function_executed
  8.     if not function_executed:
  9.         # 执行特定操作,例如验证码的处理
  10.         print("执行特定函数")
  11.         function_executed = True

  12. # 多线程任务
  13. def worker():
  14.     # 其他任务...

  15.     # 在遇到特定函数时,只执行一次
  16.     special_function()

  17.     # 其他任务...

  18. # 定时重置全局变量
  19. def reset_variable():
  20.     global function_executed
  21.     while True:
  22.         time.sleep(10 * 60)  # 每隔10分钟重置一次
  23.         function_executed = False

  24. # 创建并启动多个线程
  25. threads = []
  26. for _ in range(10):
  27.     t = threading.Thread(target=worker)
  28.     threads.append(t)
  29.     t.start()

  30. # 创建并启动重置全局变量的线程
  31. reset_thread = threading.Thread(target=reset_variable)
  32. reset_thread.start()

  33. # 等待所有线程结束
  34. for t in threads:
  35.     t.join()

  36. # 等待重置线程结束
  37. reset_thread.join()
复制代码


在上述示例中,新增了一个名为 `reset_variable` 的函数,该函数会周期性地重置全局变量 `function_executed`,这里使用了一个循环和 `time.sleep` 来实现定时重置。可以根据实际需求调整重置的时间间隔。

这样,在每次重置后,特定函数又可以被执行一次,以处理后续遇到的验证码或其他需要执行一次的操作。

请注意,对全局变量的访问和修改要进行线程同步,以避免多个线程同时修改导致的竞争条件。可以使用锁或其他同步机制来确保线程安全。

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-9-12 20:43:14 | 显示全部楼层
Mike_python小 发表于 2023-9-10 08:22
在多线程同时运行时,要想在遇到特定函数时只执行一次,可以使用同步机制来实现。以下是一种可能的解决方案 ...

还有一个问题,如果下次又遇到验证码呢?比如10分钟左右又遇到了验证码。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-12 21:04:01 | 显示全部楼层
本帖最后由 我不是第一个 于 2023-9-12 21:06 编辑
  1.         global function_executed
  2.         i = request.i
  3.         if i >= 5:
  4.             if not self.function_executed:
  5.                 self.function_executed = True
  6.                 time.sleep(30)
  7.                 print(f'{i}这个是测试用的')
  8.                 self.function_executed = False

  9.             print(f'{i}这就很六了')
  10.         else:
  11.             print(f'{i}小于五了')
复制代码



我是这样设置的,if not self.function_executed 后面的代码过于复杂,会导致其他线程也进来,所有就立马设置了self.function_executed = True, 等运行完后再设置self.function_executed = False,验证后效果没毛病,不知道有隐患没有。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-12 22:15:13 | 显示全部楼层
Mike_python小 发表于 2023-9-12 20:53
如果在一段时间后又遇到验证码,可以将上述的全局变量 `function_executed` 重新设置为 `False`,以便下次 ...

好像搞错了
第一个线程进去reset_variable执行后,其他线程不执行reset_variable,但同时必须要处于等待状态,因为要过验证码,其他线程必须获取reset_variable的结果才能继续执行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-4-1 23:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表