落地苦瓜 2024-07-05 12:09 采纳率: 25%
浏览 4
已结题

关于python的一个线程问题!

我的python代码有问题!
main.py

import subprocess as sub
from random import choice
import threading

file_list = ['Ctritical.vbs', 'Exclamation.vbs', 'Information.vbs', 'Question.vbs']

def boom():
    file = choice(file_list)
    sub.run(['cscript', file])

threads = []
while True:
    for _ in range(50):
        t = threading.Thread(target=boom())
        threads.append(t)
        threads[_].start()
    sub.run(['taskkill', 'wscript.exe'], shell=True)

它不会创建线程来运行,而是逐条运行

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-07-05 12:10
    关注

    引自免费微信小程序:皆我百晓生

    您的代码确实存在问题,所以不会按预期创建并运行多线程。以下是关于您代码的问题和修正建议:

    1. 在创建线程时,您应该传递函数对象而不是函数的调用结果。目前,target=boom() 会立即执行 boom 函数并传递其返回值(None)给线程,这是不正确的。应该改为 target=boom
    2. 您在循环中创建线程并立即启动它们,但没有等待线程完成。这可能导致程序在没有等待所有线程启动的情况下就执行到 sub.run(['taskkill', 'wscript.exe'], shell=True) 这一行。通常,您应该等待所有线程完成后再进行下一步操作。

    下面是修正后的代码:

    import subprocess as sub
    from random import choice
    import threading
    
    file_list = ['Ctritical.vbs', 'Exclamation.vbs', 'Information.vbs', 'Question.vbs']
    
    def boom():
        file = choice(file_list)
        sub.run(['cscript', file])
    
    threads = []
    
    for _ in range(50):  # 创建并启动线程,但不等待它们完成
        t = threading.Thread(target=boom)  # 传递函数对象而不是函数调用结果
        threads.append(t)
        t.start()
    
    # 等待所有线程完成
    for thread in threads:
        thread.join()  # 等待所有线程执行完毕
    
    # 现在可以安全地关闭进程或其他操作
    sub.run(['taskkill', 'wscript.exe'], shell=True)  # 或使用其他方法关闭进程
    

    这个修正后的代码会创建多个线程来运行 boom 函数中的代码,并在所有线程启动并完成后关闭 wscript.exe 进程。请注意,由于使用了多线程和子进程,程序的实际行为可能取决于操作系统和其他运行条件。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月13日
  • 已采纳回答 7月5日
  • 创建了问题 7月5日