如何同步运行python函数?

时间:2019-05-21 15:34:02

标签: python python-3.x multithreading python-multithreading

我一直在为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函数得到相同的结果。我是否误解了这些模块的用途?最终目标是在收到骰子命令时启动游戏线程,但仍允许该机器人同步工作并处理其他命令和游戏(到目前为止,所有游戏都可以立即运行或足够接近以至于不会出现冲突)

1 个答案:

答案 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()