运行 python 如何同步运行?
How to run python functions synchronously?
我一直在为 Python 构建一个 twitch 聊天机器人,它有一些我添加的自定义游戏,供观众在观看我的流时使用。我目前的目标是制作一个骰子决斗游戏(2 人游戏,获得最高数字的人将赢得所下赌注的总和)。为了玩,我希望两个玩家在允许比赛继续之前接受比赛,但我也想实现一个比赛计时器,这样如果另一个用户在计时器到期前不接受比赛,它将取消比赛.我想为每个游戏创建一个新线程并扫描以查看游戏是否已过期,但需要它们与聊天机器人的其余部分并行 运行,否则我一次只能玩 1 个游戏时间,当它发生时,机器人的其余部分将逐渐停止。
我已经尝试过的是使用 Python 中包含的多线程模块创建两个进程并启动它们。我也试过使用线程模块,它提供了相同的结果。这是我为使其工作而编写的多线程代码。
processes = []
# Tick has a basic print statement, and a sleep statement for testing.
# Tried without the sleep, and used a for loop to print "test" 100 times as well to see if the sleep was causing the issue
tickprocess = multiprocessing.Process(target=tick())
processes.append(tickprocess)
# Main initializes settings and starts the chatbot
chatbotprocess = multiprocessing.Process(target=main())
processes.append(chatbotprocess)
for item in processes:
item.start()
它的作用是启动 tick 进程,但它会在启动聊天机器人进程之前等待它完成,这与我想做的相反,因为我可以只调用 tick 函数,然后调用 main函数以获得相同的结果。我是否误解了这些模块的用途?最终目标是在收到骰子命令时启动一个游戏线程,但仍然允许机器人同步工作并处理其他命令和游戏(所有游戏到这一点 运行 立即或足够接近立即发生冲突不是问题)。
tick()
和 main()
是函数调用。所以实际上你调用函数tick
,得到它的结果(大概是None
),然后将该结果传递给multiprocessing.Process()
.
您想要的是将 tick
(以及后来的 main
)函数传递给 multiprocessing.Process()
:
tickprocess = multiprocessing.Process(target=tick)
如果你仔细查看文档(https://docs.python.org/3.4/library/multiprocessing.html?highlight=process#the-process-class),它就在第一个示例中:
from multiprocessing import Process
def f(name):
print('hello', name)
if __name__ == '__main__':
p = Process(target=f, args=('bob',)) # <------ target=f, not target=f()
p.start()
p.join()
我一直在为 Python 构建一个 twitch 聊天机器人,它有一些我添加的自定义游戏,供观众在观看我的流时使用。我目前的目标是制作一个骰子决斗游戏(2 人游戏,获得最高数字的人将赢得所下赌注的总和)。为了玩,我希望两个玩家在允许比赛继续之前接受比赛,但我也想实现一个比赛计时器,这样如果另一个用户在计时器到期前不接受比赛,它将取消比赛.我想为每个游戏创建一个新线程并扫描以查看游戏是否已过期,但需要它们与聊天机器人的其余部分并行 运行,否则我一次只能玩 1 个游戏时间,当它发生时,机器人的其余部分将逐渐停止。
我已经尝试过的是使用 Python 中包含的多线程模块创建两个进程并启动它们。我也试过使用线程模块,它提供了相同的结果。这是我为使其工作而编写的多线程代码。
processes = []
# Tick has a basic print statement, and a sleep statement for testing.
# Tried without the sleep, and used a for loop to print "test" 100 times as well to see if the sleep was causing the issue
tickprocess = multiprocessing.Process(target=tick())
processes.append(tickprocess)
# Main initializes settings and starts the chatbot
chatbotprocess = multiprocessing.Process(target=main())
processes.append(chatbotprocess)
for item in processes:
item.start()
它的作用是启动 tick 进程,但它会在启动聊天机器人进程之前等待它完成,这与我想做的相反,因为我可以只调用 tick 函数,然后调用 main函数以获得相同的结果。我是否误解了这些模块的用途?最终目标是在收到骰子命令时启动一个游戏线程,但仍然允许机器人同步工作并处理其他命令和游戏(所有游戏到这一点 运行 立即或足够接近立即发生冲突不是问题)。
tick()
和 main()
是函数调用。所以实际上你调用函数tick
,得到它的结果(大概是None
),然后将该结果传递给multiprocessing.Process()
.
您想要的是将 tick
(以及后来的 main
)函数传递给 multiprocessing.Process()
:
tickprocess = multiprocessing.Process(target=tick)
如果你仔细查看文档(https://docs.python.org/3.4/library/multiprocessing.html?highlight=process#the-process-class),它就在第一个示例中:
from multiprocessing import Process def f(name): print('hello', name) if __name__ == '__main__': p = Process(target=f, args=('bob',)) # <------ target=f, not target=f() p.start() p.join()