import asyncio
import random
class Bot:
def __init__(self, bot_name, queue):
self._name = bot_name
self._queue = queue
async def start(self):
try:
while True:
data = await self._queue.get()
print('{}: {}'.format(self._name, data))
except asyncio.CancelledError:
print("{}: stoped".format(self._name))
async def message_generator(bots):
i = 0
while True:
for bot in bots:
i += 1
await bot["queue"].put("msg {}".format(i))
await asyncio.sleep(((random.random()/2.0)+0.1))
if __name__ == '__main__':
loop = asyncio.get_event_loop()
bots = []
n = 4
for i in range(n):
q = asyncio.Queue()
t = loop.create_task(Bot("bot{}".format(i), q).start())
bot = {
"queue": q,
"task": t
}
bots.append(bot)
try:
loop.run_until_complete(message_generator(bots))
except KeyboardInterrupt:
for bot in bots:
bot["task"].cancel()
loop.run_until_complete(bot["task"])
loop.stop()
Group {
name: "cpp_os_specific"
prefix: "src/cpp/utils/"
files: {
if (qbs.targetOS.contains("windows"))
return ["utils_windows.cpp", "utils.h"];
if (qbs.targetOS.contains("linux"))
return ["utils_linux.cpp", "utils.h"];
}
}
import qbs 1.0
Product {
type: "application"
name: "timer_qml"
consoleApplication: false
Group {
name: "cpp"
prefix: "src/cpp/"
files: ["*.cpp", "*.h"]
}
Group {
name: "cpp_os_specific"
prefix: "src/cpp/utils/"
files: {
if (qbs.targetOS.contains("windows"))
return ["utils_windows.cpp", "utils.h"];
if (qbs.targetOS.contains("linux"))
return ["utils_linux.cpp", "utils.h"];
}
}
Group {
name: "resources_and_qml"
prefix: "src/qrc/"
files: ["*.qrc", "*.qml"]
}
Depends {
name: "Qt"
submodules: {
if (qbs.targetOS.contains("windows"))
return ["core", "widgets", "gui", "sql", "quick", "qml"];
if (qbs.targetOS.contains("linux"))
return ["core", "widgets", "gui", "sql", "quick", "qml", "x11extras"];
}
}
Depends {
name: "cpp"
}
cpp.staticLibraries: {
if (qbs.targetOS.contains("windows"))
return ["user32"];
else
return [];
}
cpp.cxxFlags: {
if (qbs.toolchain.contains("gcc") || qbs.toolchain.contains("mingw"))
return ["-std=c++11"];
else
return [];
}
cpp.dynamicLibraries: {
if (qbs.targetOS.contains("linux"))
return ["Xss", "X11"];
else
return [];
}
Group {
name: "App itself"
fileTagsFilter: parent.type
qbs.install: true
qbs.installDir: "bin"
}
}
Сталкивались ли вы с докером? Если да, то не кажется ли вам,С докером сталкивался, но на винде не использовал volumes. Попробуйте, может и заработает. Я под виндой в докере гонял базу Postgres, в принципе всё тоже самое как и в линуксе, всё очень гладко интегрировано. По сути это тоже самое что с вагрантом но вместо virtualbox будет HyperV и образ убунты будет слегка порезан (но не критично, всё можно доустановить).
что его volumes помогут решить проблему с символическими ссылками?
Докер, вроде уже умеет с виндой работатьДа, есть установщик и графическая утилита для контроля за докером. Выглядит качественно :) но мой опыт с ним минимален.
"подключаемся по ssh" - работа с убунтовой консолью из винды?Да.
Можно ли пробросить порты из виртуалки и смотреть прилодение через виндовый браузер?Да
Последний вопрос: требования к железу высокие?я свой проект гонял на 512 мб ОЗУ. В виртуалке работал сервер приложения и база Postgres (очень маленького размера). Никаких проблем небыло, версия ubuntu - 14.04
... параллельно обрабатывать запросы пользователей ... вызывается какая-то тяжелая функция, пока эта функция не завершится, запрос другого пользователя не будет обработан, а начнется обрабатываться только после окончания обработки запроса первого пользователя. Как это избежать? ...
[program:my_websocket_server]
startsecs=4
user=some_user
directory=/path/to/websocket/working/directory
command=/path/to/websocket/binary
При перезагрузке сервера супервизор перезапускает вашу программу, если надо остановить или перезапустить вручную, для этого есть команда supervisorctl.