我一直在为Python构建一个抽动聊天机器人,其中添加了一些自定义游戏,以使观众在观看我的视频流时可以使用一些东西。我当前的目标是制作骰子决斗游戏(2人游戏,其中获得最高数字的人赢得了所下注的总和)。为了玩游戏,我希望两个玩家在允许比赛继续之前都接受比赛,但是我也想实现比赛计时器,以便如果另一个用户在计时器到期之前不接受比赛,它将取消比赛。我想为每个游戏创建一个新线程,然后扫描以查看游戏是否已到期,但是需要它们与聊天机器人的其余部分并行运行,否则我一次只能拥有一个游戏,并且僵尸的其余部分会在发生时停止运行。
我已经尝试过使用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()
此操作将启动滴答处理,但在启动聊天机器人处理之前会等待它完成,这与我要执行的操作相反,因为我可以先调用滴答函数,然后再调用main函数得到相同的结果。我是否误解了这些模块的用途?最终目标是在收到骰子命令时启动游戏线程,但仍允许该机器人同步工作并处理其他命令和游戏(到目前为止,所有游戏都可以立即运行或足够接近以至于不会出现冲突)
答案 0 :(得分:2)
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()